C++11新特性(27)-容器的emplace成員

問題還是老問題

考慮下面的Rect類:

struct Rect{  Rect(int l,int t,int r,int b)   :left{l},top{t}   ,right{r},bottom{b}  {}  int left;  int top;  int right;  int bottom;};

當需要向容器添加Rect對象時,代碼大致是這樣的:

std::list<Rect> rlist;rlist.push_front(Rect(10,10,20,20));

在調用push_front時,首先構造一個臨時的Rect對象傳遞給push_front方法,然後在push_front的內部,在複製一個Rect對象添加到容器中。全過程會發生一次創建動作和一次拷貝動作,才能將對象的內容添加到list當中去。

Advertisements

emplace成員

為了減少拷貝動作的次數,當然可以使用右值引用參數的成員函數。除此之外,C++11還提供了另一種方法:emplace成員。使用這個成員可以直接傳遞用於生成對象的參數,對象的創建過程交給容器去執行:

std::list<Rect> rlist;rlist.emplace_front(10,10,20,20);

用法非常簡單,只要保證參數和元素構造函數的參數相同即可。

除了emplace_front以外,C++11還提供了emplace和emplace_bak方法,分別對應insert和push_back方法。

emplace語義

為了更好的理解和說明emplace,去百度查了一下,結果如下:

Advertisements

並沒有發現什麼有價值的線索,權當學英語了。。。

作者觀點

當創建對象的目的只是為了將其添加到容器中時,emplace提供了右值引用以外的另一個選擇。

覺得本文有幫助?請分享給更多人。

關注【面向對象思考】,輕鬆學習每一天!

Advertisements

你可能會喜歡