目录
前言
1. 基本区别
2. 性能差异
3. 构造参数传递
4. 使用场景总结
前言
push_back()
更适合在已经有对象实例的情况下使用。emplace_back()
则更适合需要在容器内部直接构造对象的场景,特别是在性能敏感的情况下。
1. 基本区别
-
push_back()
:- 作用:将一个已构造的对象或临时对象复制或移动到容器的末尾。
- 使用场景:适合在对象已经存在,或需要将现有对象的副本或移动语义插入到容器中时使用。
- 示例:
std::vector<std::string> vec;
std::string str = "example";
vec.push_back(str); // 复制 str 到 vec 中
vec.push_back("example"); // 插入临时对象 "example"
-
emplace_back()
:- 作用:在容器末尾直接构造对象,避免不必要的复制或移动。
- 使用场景:适合直接在容器内部构造对象,特别是当对象构造较为复杂时,
emplace_back()
可以减少一次构造和析构的开销。 - 示例:
std::vector<std::string> vec;
vec.emplace_back("example"); // 直接在 vec 中构造 "example"
2. 性能差异
push_back()
: 在插入时可能涉及一次额外的对象复制或移动(先构造一个临时对象,再将其复制或移动到容器中)。emplace_back()
: 直接在目标位置构造对象,通常避免了对象的复制或移动,因此在某些情况下性能更优。
3. 构造参数传递
push_back()
: 需要传入一个已经构造好的对象。emplace_back()
: 可以直接传递构造函数的参数,允许在容器内构造对象。
std::vector<std::pair<int, std::string>> vec;
vec.push_back(std::make_pair(1, "example")); // 需要先构造一个 std::pair 对象
vec.emplace_back(1, "example"); // 直接在 vec 中构造 std::pair 对象
4. 使用场景总结
-
push_back()
:- 使用现有对象的副本或移动语义插入到容器中。
- 当对象已经存在或构造较为简单时,
push_back()
足够使用。
-
emplace_back()
:- 在容器内直接构造对象,特别适合构造较为复杂的对象,或避免不必要的对象拷贝。
- 推荐在需要传递多个构造参数的情况下使用
emplace_back()
。