push_back()和emplace_back()的区别
3 分钟阅读
•
297 字
+
420 词
参考答案
push_back()
和
emplace_back()
都是C++标准库容器(如
std::vector
)中用来添加元素的方法,但它们在添加元素的方式上有所不同:
-
push_back():-
语法是
container.push_back(value);,传入的是一个值或对象的副本/移动版本。 - 它接受一个元素的副本或移动该元素,然后将其添加到容器的末尾。
- 这 个方法需要先构造一个元素的副本或移动构造一个临时对象,然后再将其添加到容器中 。
-
语法是
-
emplace_back():-
语法是
container.emplace_back(args...);,传入的是构造新元素所需的参数列表。 - 它使用 就地构造 (emplace)的方式, 直接在容器的内存空间中构造新元素 。
- 这个方法 避免了元素的复制或移动操作 ,因为它直接在容器的末尾空间构造新元素。
-
语法是
-
性能:
-
在参数为纯右值(临时对象)时,
emplace_back()比push_back()更高效,因为它 避免了额外的复制或移动 操作。 -
当构造函数需要大量资源时,
emplace_back()的优势更加明显。
-
在参数为纯右值(临时对象)时,
-
陷阱:
- emplace_back会让隐式转换通过编译,可能产生UB。比如regexes.emplace_back(nullptr);
- push_back的隐式转换不会通过编译。regexes.emplace_back(nullptr);会发生错误
- emplacement比push_back更不安全