Skip to content

vector中push_back和emplace_back的区别?

问题

vector中 push_backemplace_back 有什么区别?

回答

push_back 接受一个已构造好的对象并把它拷贝或移动到容器尾部;
emplace_back 则直接在容器尾部原地构造对象,避免创建临时对象和额外的拷贝/移动开销。

struct Foo {
    Foo(int a, int b) { /* ... */ }
};

std::vector<Foo> v;

// push_back:对象先构造,再拷贝/移动到容器
Foo f1(1, 2);         // 构造一次
v.push_back(f1);      // 拷贝一次
v.push_back(Foo(3,4));// 临时对象构造一次,再移动或拷贝一次

// emplace_back:直接在容器尾部构造
v.emplace_back(5, 6); // 原地构造一次,无额外拷贝/移动

补充

  • 如果已有对象,可以使用 push_back(std::move(obj))emplace_back(std::move(obj)),两者开销相近。
  • emplace_back 通过完美转发参数,如果构造函数存在多义性,需要注意调用是否正确。