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提供了右值引用以外的另一個選擇。
覺得本文有幫助?請分享給更多人。
關注【面向對象思考】,輕鬆學習每一天!