vector的push_back和emplace_back有什么区别?
vector
的 push_back
和 emplace_back
函数都是用来在 vector
的末尾添加新元素的,但它们之间有几个关键的区别:
- 构造方式:
push_back
函数会复制或移动已经构造好的对象到vector
的末尾。emplace_back
函数则是直接在vector
的末尾构造新元素,它接受的是构造函数的参数,而不是对象本身。
- 性能:
- 使用
push_back
时,如果传入的是一个临时对象,它首先会被构造,然后再被复制或移动到vector
中(C++11起,会尝试使用移动构造减少开销)。 emplace_back
则可以避免这些额外的复制或移动操作,因为它直接在容器的内存中构造对象,从而可能提供更好的性能。
- 使用
- 例子:
- 使用
push_back
添加一个复杂对象时:myVector.push_back(MyClass(a, b, c));
这里a, b, c
是传递给MyClass
构造函数的参数,首先在外部构造一个临时的MyClass
对象,然后将其添加到vector
。 - 使用
emplace_back
相同的操作:myVector.emplace_back(a, b, c);
这里直接将参数a, b, c
传递给emplace_back
,在vector
的内存空间中直接构造对象,无需临时对象。
- 使用
应用场景
- 优化性能:如果你正在添加的对象是通过多个参数构造的,而这些参数是用来直接构造对象的,使用
emplace_back
可以减少不必要的临时对象创建和复制/移动操作,从而优化性能。 -
复杂对象:对于构造函数参数多,或者构造成本高的对象,
emplace_back
更能显示其性能优势。
在实践中,如果要添加的元素是简单的或已存在的对象,push_back
和 emplace_back
的性能差异可能不明显。然而,对于复杂的对象或者需要构造的场景,emplace_back
往往是更好的选择。