vector的push_back()与emplace_back() 2024-12-04

push_back()与emplace_back()

vector<string> res;
res.push_back()res.emplace_back() 在功能上类似,但它们之间有一些关键的区别。让我们详细比较一下它们:


1. push_back()

  • 作用:将一个已经构造好的对象添加到容器的末尾。
  • 语法res.push_back(value);
  • 特点
    • push_back() 会复制或移动一个现有对象到容器中。
    • 必须先构造 value 对象,然后才能将其添加到容器中。

示例:

std::vector<std::string> res;
std::string s = "hello";  // 构造对象
res.push_back(s);         // 复制 s 到 res 中
// 或者使用移动
res.push_back(std::move(s));  // 移动 s 到 res 中

2. emplace_back()

  • 作用:直接在容器的末尾原地构造对象
  • 语法res.emplace_back(args...);
  • 特点
    • emplace_back() 通过传递构造函数的参数,直接在容器末尾构造对象,避免了不必要的临时对象和拷贝。
    • 更高效,尤其是在对象的构造和拷贝成本较高时(如复杂类对象)。

示例:

std::vector<std::string> res;
res.emplace_back("hello");  // 直接在容器中构造一个 std::string 对象

主要区别:

区别 push_back() emplace_back()
对象构造 需要一个已构造的对象进行复制或移动。 直接在容器内构造对象,避免临时对象。
性能 可能涉及一次或多次拷贝/移动操作。 通常更高效,避免了不必要的拷贝或移动。
使用场景 已有对象或简单对象。 构造复杂对象或需要传递构造函数参数时。

总结:

  • 如果你已经有一个对象实例并想将它添加到容器中,使用 push_back()
  • 如果你想直接在容器中构造对象,避免拷贝或移动,使用 emplace_back()

在现代 C++ 编程中,如果需要构造对象,通常推荐使用 emplace_back(),因为它可以提高性能并简化代码。

允许的

vector<string> res;
res.push_back();
res.push_back("hello");

区别 push_back("hello") emplace_back("hello")
操作 隐式构造 std::string,然后移动或复制。 直接在容器中构造 std::string。
性能 可能涉及一次构造和一次移动操作。 通常更高效,避免额外的移动。
推荐场景 已经有现成的 std::string 对象。 直接使用构造参数构造对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。