在C++中,std::vector
是一个动态数组容器,提供了多种方法来添加元素。push_back
和emplace_back
都是用来在vector
的末尾添加新元素的方法,但它们在内部实现和性能上有所不同:
-
push_back:
push_back
方法接受一个参数,这个参数是要添加到vector
末尾的元素的值。- 这个方法首先会创建一个参数的副本(或者移动它,如果参数是可移动的),然后将这个副本(或移动后的对象)添加到
vector
中。 - 如果
vector
的容量不足以容纳新元素,它会导致vector
进行重新分配,这个过程涉及到内存分配和元素的复制或移动。
-
emplace_back:
emplace_back
方法接受一个或多个参数,这些参数用来在vector
的末尾直接构造元素。- 这个方法使用提供的参数在
vector
的内存中直接构造元素,避免了不必要的复制或移动操作。 emplace_back
通常比push_back
更高效,因为它减少了临时对象的创建和销毁,以及可能的复制或移动操作。
-
性能区别:
push_back
可能涉及到临时对象的创建和复制或移动操作,这在处理大型对象或资源密集型对象时可能会影响性能。emplace_back
通过直接在容器中构造元素来避免这些额外的开销,从而提供更好的性能。
-
使用场景:
- 当你有一个已经构造好的对象,并且想要将其添加到
vector
中时,push_back
是合适的选择。 - 当你想要直接在
vector
中构造元素,并且避免复制或移动操作时,emplace_back
是更好的选择。
- 当你有一个已经构造好的对象,并且想要将其添加到
示例:
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec;
// 使用 push_back
std::string str = "Hello";
vec.push_back(str); // 复制 str 到 vec
// 使用 emplace_back
vec.emplace_back("World"); // 直接在 vec 中构造字符串
return 0;
}
在这个例子中,push_back
涉及到str
的复制,而emplace_back
直接在vector
中构造了一个新的字符串,避免了复制操作。
总结来说,emplace_back
通常比push_back
更高效,因为它减少了临时对象的创建和不必要的复制或移动操作。然而,选择哪个方法取决于具体的使用场景和性能要求。