C++11_emplace_back的優(yōu)點

視頻教程:https://www.bilibili.com/video/av86157003

emplace_back的特點

  • 當(dāng)調(diào)用push_back或insert成員函數(shù)時蹬碧,是把元素類型的對象傳遞給它們舱禽,這些對象被拷貝到容器中。而當(dāng)我們調(diào)用一個emplace系列函數(shù)時恩沽,則是將相應(yīng)參數(shù)傳遞給元素類型的構(gòu)造函數(shù)誊稚。
  • 這樣emplace_back能就地通過參數(shù)構(gòu)造對象,不需要拷貝操作罗心,相比push_back能更好的避免內(nèi)存的拷貝和移動里伯,提升容器插入元素的性能。
  • 大多數(shù)情況都應(yīng)該使用emplace系列函數(shù):emplace; emplace_back; emplace_hit; emplace_fornt; emplace_after

emplace系列函數(shù)需要有對應(yīng)的構(gòu)造函數(shù)

  • emplace函數(shù)需要對應(yīng)的參數(shù)對象有對應(yīng)的構(gòu)造函數(shù)渤闷,不然編譯報錯
  • emplace函數(shù)在容器中直接構(gòu)造元素疾瓮。傳遞給emplace函數(shù)的參數(shù)必須與元素類型的構(gòu)造函數(shù)相匹配
#include<iostream>
#include<list>


struct A
{
    int x;
    double y;

    A()
    {
        x = 0;
        y = 1.0;
    }

    A(int a, double b)
    {
        x = a;
        b = y;
    }
};

int main()
{
    std::list<A> listSample;
    listSample.emplace_back(1, 2.0);
    std::cout << listSample.size() << std::endl;
    return 0;
}

emplace_back和push_back的簡單比較

///////////////////////////////////////////////////////
// reference: http://en.cppreference.com/w/cpp/container/vector/emplace_back
namespace {
    struct President {
        std::string name;
        std::string country;
        int year;


        President(std::string p_name, std::string p_country, int p_year)
            : name(std::move(p_name)), country(std::move(p_country)), year(p_year)
        {
            std::cout << "I am being constructed.\n";
        }
        President(President&& other)
            : name(std::move(other.name)), country(std::move(other.country)), year(other.year)
        {
            std::cout << "I am being moved.\n";
        }
        President& operator=(const President& other) = default;
    };
}


int emplacevspush()
{
    std::cout << "test_emplace_2()" << std::endl;
    /*
    The following code uses emplace_back to append an object of type President to a std::vector.
    It demonstrates how emplace_back forwards parameters to the President constructor and shows
    how using emplace_back avoids the extra copy or move operation required when using push_back.
    */
    std::vector<President> elections;
    std::cout << "emplace_back:\n";
    elections.emplace_back("Nelson Mandela", "South Africa", 1994);


    std::vector<President> reElections;
    std::cout << "\npush_back:\n";
    reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));


    std::cout << "\nContents:\n";
    for (President const& president : elections) {
        std::cout << president.name << " was elected president of "
            << president.country << " in " << president.year << ".\n";
    }
    for (President const& president : reElections) {
        std::cout << president.name << " was re-elected president of "
            << president.country << " in " << president.year << ".\n";
    }


    return 0;
}

//output
emplace_back:
I am being constructed.


push_back:
I am being constructed.
I am being moved.


Contents:
Nelson Mandela was elected president of South Africa in 1994.
Franklin Delano Roosevelt was re-elected president of the USA in 1936.

如例子所示,使用emplace_back函數(shù)可以減少一次拷貝或移動構(gòu)造的過程飒箭,提升容器插入數(shù)據(jù)的效率

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狼电,一起剝皮案震驚了整個濱河市蜒灰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肩碟,老刑警劉巖强窖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異削祈,居然都是意外死亡翅溺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門髓抑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來未巫,“玉大人,你說我怎么就攤上這事启昧⌒鸱玻” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵密末,是天一觀的道長握爷。 經(jīng)常有香客問我,道長严里,這世上最難降的妖魔是什么新啼? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮刹碾,結(jié)果婚禮上燥撞,老公的妹妹穿的比我還像新娘。我一直安慰自己迷帜,他們只是感情好物舒,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戏锹,像睡著了一般冠胯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锦针,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天荠察,我揣著相機與錄音,去河邊找鬼奈搜。 笑死悉盆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馋吗。 我是一名探鬼主播焕盟,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耗美!你這毒婦竟也來了京髓?” 一聲冷哼從身側(cè)響起航缀,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堰怨,沒想到半個月后芥玉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡备图,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年灿巧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽涮。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡抠藕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒋困,到底是詐尸還是另有隱情盾似,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布雪标,位于F島的核電站零院,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏村刨。R本人自食惡果不足惜告抄,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嵌牺。 院中可真熱鬧打洼,春花似錦、人聲如沸逆粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枯饿。三九已至酝锅,卻和暖如春诡必,著一層夾襖步出監(jiān)牢的瞬間奢方,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工爸舒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟋字,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓扭勉,卻偏偏與公主長得像鹊奖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涂炎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容