(我的STL相關的博客目錄:https://blog.csdn.net/Kprogram/article/details/90408011)
這裏用stack來進行舉例操作
第一點,push 的操作可以直接用於emplace:
1.直接傳入對象(int, double 或者 構造好了的對象)
//假設棧內的數據類型是data
class data {
int a;
int b;
public:
data(int x, int y):a(x), b(y) {}
};
//push
data d(1,2);
S.push(d) 或 S.emplace(d);
2.在傳入時候構造對象
S.push(data(1,2));
S.emplce(data(1,2));
3.emplace可以直接傳入構造對象需要的元素,然後自己調用其構造函數!
S.emplace(1,2)
意思是,emplace這樣接受新對象的時候,自己會調用其構造函數生成對象然後放在容器內(比如這裏傳入了1,2,它則會自動調用一次data(1,2))
而push,只能讓其構造函數構造好了對象之後,再使用複製構造函數!
相當於emplace直接把原料拿進家,造了一個。而push是造好了之後,再複製到自己家裏,多了複製這一步。
所以emplace相對於push,使用第三種方法會更節省內存。
注意:emplace_back(type) 對應 push_back(type)
emplace(i, type) 對應於 insert(type, i)
emplace_front(type) 對應於 push_front()
但是!對於stack 和 queue,只有push操作,所以也只有emplace操作,此時它們是相對應的。