C 11新特性之十一 emplace

2021-08-20 03:46:07 字數 1011 閱讀 9828

emplace操作是c++11新特性,新引入的的三個成員emlace_front、empace 和 emplace_back,這些操作構造而不是拷貝元素到容器中,這些操作分別對應push_front、insert 和push_back,允許我們將元素放在容器頭部、乙個指定的位置和容器尾部。

兩者的區別

當呼叫insert時,我們將元素型別的物件傳遞給insert,元素的物件被拷貝到容器中,而當我們使用emplace時,我們將引數傳遞元素型別的構造函,emplace使用這些引數在容器管理的記憶體空間中直接構造元素。

乙個例子

mystring.h

#ifndef mystring_h

#define mystring_h

#include class mystring

;#endif // mystring_h

mystring.cpp

#include "mystring.h"

#include #include //普通建構函式

mystring::mystring(const char *str)

else

std::cout<

#include #include "mystring.h"

int main()

system("pause");

return 0;

}

輸出結果

從結果可以看出,vstr.push_back(mystring("can ge ge blog")) 這個語句首先執行了建構函式,構造乙個臨時物件,接著執行拷貝構造將臨時物件複製到vector,最後銷毀臨時物件和vector中的元素。而emplace_back只呼叫一次建構函式和一次析構函式。兩相對比,效率上的提高不言而喻

C 11新特性之 nullptr

我們知道在程式設計的世界裡,0有雙重的角色,可以表示整數零,也可以表示乙個空指標。在c語言中,通過預編譯巨集null,可以區分0表示的是零還是 void 0.但是,在c 的世界中,這樣是不可以的。c 中允許函式過載。例如 void foo char void foo int 如果把null定義為0,...

c 11新特性之auto

在早期版本中,auto關鍵字用來宣告具有自動儲存器的區域性變數,auto關鍵字很少被使用,除了靜態變數之外,其它的變數預設是auto的。因此,在c 11中,刪除了原有的功能,並對其重新設計,增加了auto的型別推導功能。template double add t1 a,t2 b int main i...

C 11 新特性之 lambda

這是c 11新特性介紹的第三部分,涉及到c 11這次更新中較為重要的lambda表示式。不想看toy code的讀者可以直接拉到文章最後看這部分的總結。熟悉python的程式設計師應該對lambda不陌生。簡單來說,lambda就是乙個匿名的可呼叫 塊。在c 11新標準中,lambda具有如下格式 ...