在C++中,emplace_back
和push_back
都是std::vector
等序列容器的成员函数,它们都用于在容器的末尾添加新元素。然而,它们在添加元素的方式上有所不同,这导致了它们在性能和使用场景上的差异。
-
push_back
:push_back
函数首先会构造一个临时对象,这个临时对象是通过参数传递给push_back
的。- 然后,这个临时对象会被复制(如果元素类型是拷贝可构造的)或移动(如果元素类型是移动可构造的)到容器中。
- 这意味着如果元素类型是一个大型对象或者有昂贵的拷贝构造函数,使用
push_back
可能会导致性能问题,因为它涉及到了额外的复制或移动操作。
-
emplace_back
:emplace_back
函数直接在容器的内存中构造新元素,避免了临时对象的创建。- 它接受构造函数所需的参数,并将这些参数直接用于在容器内部构造新元素。
- 这种方式可以减少不必要的复制或移动操作,特别是对于大型对象或者资源密集型对象,
emplace_back
可以提供性能上的优势。
#include <vector>
#include <string>
int main() {
std::vector<std::string> v;
// 使用push_back添加一个临时字符串对象
v.push_back(std::string("Temporary string"));
// 使用emplace_back直接在vector中构造一个字符串对象
v.emplace_back("Directly constructed string");
for (const auto& s : v) {
std::cout << s << '\n';
}
return 0;
}
在上面的代码中,push_back
创建了一个临时的std::string
对象,然后将其添加到vector
中。而emplace_back
则直接使用提供的参数在vector
的内存中构造了一个std::string
对象,没有创建临时对象。
总结来说,emplace_back
和push_back
的主要区别在于emplace_back
避免了临时对象的创建和随后的复制或移动,因此在性能上通常更优。