天天看點

C++11新特性:emplace操作

 C++11為順序容器引入了三個新成員——emplace_front、emplace和emplace_back,分别對應push_front、insert和push_back,允許我們将元素放置在容器頭部、任意指定位置之前或容器尾部。與後三者不同在于,emplace的三種操作構造而不是拷貝元素。

 當調用push或insert成員函數時,我們将元素類型的對象傳遞給它們,這些對象被拷貝到容器中。而當調用一個emplace成員函數時,則是将參數傳遞給元素類型的構造函數。emplace成員使用這些參數在容器管理的記憶體空間中直接構造元素。換句話說,傳統操作會先建立一個臨時對象,再把臨時對象的值賦給目标對象的記憶體空間,在類類型中這會觸發兩次構造函數(一次是初始化構造,一次是拷貝構造)。而emplace操作則直接在目标對象的記憶體空間中擴充,構造新的對象,省去了中間步驟。這樣在時間上和空間上的效率都得到了提高。這一點在插入記憶體占用較大的複合類型中展現得尤為明顯。

 emplace函數在容器中直接構造元素,是以傳遞給emplace函數的參數必須與元素類型的構造函數相比對。