最近读《C++ 标准库》这本书,发现C++11
中大部分的容器对于添加元素除了传统的 insert
或者 pusb_back/push_front
之外都提供一个新的函数叫做 emplace
。 比如如果你想要向 std::vector
的末尾添加一个数据,你可以:
std::vector<int> nums;
nums.push_back(1);
你也可以使用:
std::vector<int> nums;
nums.empace_back(1);
那么这两种方式的区别到底是什么呢?在《C++标准库》一书中没有给出解释,我查了一 下相关的资料,在此做一个总结。
emplace
最大的作用是避免产生不必要的临时变量,因为它可以完成 in place
的构 造,举个例子[^1]:
struct Foo {
Foo(int n, double x);
};
std::vector<Foo> v;
v.emplace(someIterator, 42, 3.1416); // 没有临时变量产生
v.insert(someIterator, Foo(42, 3.1416)); // 需要产生一个临时变量
v.insert(someIterator, {42, 3.1416}); // 需要产生一