Emplace_back而不是在 stl 容器上push_back

Emplace_back instead of push_back on stl containers?

本文关键字:back push stl Emplace      更新时间:2023-10-16

我不太确定我是否总是可以用emplace_back替换push_back

我知道emplace_back可以转发参数以直接在向量中构造对象,而无需复制两次(完美转发等......

如果我这样做:

vector<A> o;
o.emplace_back(A{});

那么它应该调用 A. 的复制构造函数。所以它的作用与push_back完全相同。不是吗?

有一些例外吗?有充分的理由使用push_back吗?因为这样更容易总是emplace_back使用而不考虑它。

emplace的主要

目的是执行显式转换

#include <chrono>
#include <vector>
using namespace std::chrono_literals;
std::vector<std::chrono::seconds> time;
time.push_back(1s);     // OK
// time.push_back(1);   // Error, thank god
time.emplace_back(1);   // OK, we assume you know what you're doing

使用 push_back 将给定值的元素添加到容器中。使用 emplace_back 从构造函数参数显式构造元素。

"emplace_back"的另一个应用程序(除了 Kerrek SB 的答案)是在容器中构造一个不可复制/不可移动的对象:

#include <list>
class Resource
{
    private:
    int id;
    int data;
    public:
    Resource(int id, int data) : id(id), data(data) {}
    Resource(const Resource&) = delete;
    Resource& operator = (const Resource&) = delete;
};
int main() {
    std::list<Resource> resources;
    // The following will not compile:
    // resources.push_back(Resource(1, 2));
    resources.emplace_back(1, 2);
}