1. 概述 push 和 emplace 函数都是用于将元素添加到容器中,但它们的工作方式有所不同。 首先emplace_back不会取代push_back,详细看看下面的对比: emplace_back: - emplace_back 函数直接在容器的尾部构造元素,它可以接受任意数量和类型的参数,这些参数正是容器中的元素类型的构造函数所需要的。
- 使用 emplace_back 可以避免临时对象的创建和可能的拷贝或移动操作。因为它是直接在容器内存空间中构建对象的,所以它可能会比 push_back 更高效。
- emplace_back 对于含有非复制或移动构造的对象来说尤其有用,因为它允许在容器中直接构建复杂对象。
push_back: - push_back 函数是在容器末尾添加一个已经构造好的对象的副本。
- 当向容器添加元素时,push_back 通常涉及到拷贝或移动构造函数,因为它需要一个完整的对象作为参数。在 C++11 后,如果传入一个临时对象,push_back 可以利用移动语义来减少拷贝开销。
- 对于简单数据类型(如 int、float、指针等),push_back 和 emplace_back 的效率差别并不明显。
两者之间的选择取决于使用情景: - 如果您已经有一个对象实例并且想要将其添加到容器中,使用 push_back 是合适的。
- 如果您想要构造一个新对象并直接放到容器中,使用 emplace_back 可以避免额外的拷贝或移动操作,从而更为高效。
2. 差异对比这两个函数的主要区别在于它们如何处理对象的构造和插入: - push:需要你先创建一个对象,然后传递这个对象给 push 函数。如果对象类型有移动构造函数,那么可能会触发移动语义以减少开销。否则,会进行拷贝构造。
- emplace:不需要你创建对象,它将传递给 emplace 的参数直接传递给对象类型的构造函数,从而在容器内存中就地构造对象(即直接在容器的目标位置构造),无需额外的拷贝或移动操作。
|