push_back()和emplace_back()的区别

3 分钟阅读 297 字 + 420 词
参考答案
push_back() emplace_back() 都是C++标准库容器(如 std::vector )中用来添加元素的方法,但它们在添加元素的方式上有所不同:
  1. push_back()
    • 语法是 container.push_back(value); ,传入的是一个值或对象的副本/移动版本。
    • 它接受一个元素的副本或移动该元素,然后将其添加到容器的末尾。
    • 个方法需要先构造一个元素的副本或移动构造一个临时对象,然后再将其添加到容器中
  2. emplace_back()
    • 语法是 container.emplace_back(args...); ,传入的是构造新元素所需的参数列表。
    • 它使用 就地构造 (emplace)的方式, 直接在容器的内存空间中构造新元素
    • 这个方法 避免了元素的复制或移动操作 ,因为它直接在容器的末尾空间构造新元素。
  3. 性能:
    • 在参数为纯右值(临时对象)时, emplace_back() push_back() 更高效,因为它 避免了额外的复制或移动 操作。
    • 当构造函数需要大量资源时, emplace_back() 的优势更加明显。
  4. 陷阱:
    1. emplace_back会让隐式转换通过编译,可能产生UB。比如regexes.emplace_back(nullptr);
    2. push_back的隐式转换不会通过编译。regexes.emplace_back(nullptr);会发生错误
    3. emplacement比push_back更不安全