繁体   English   中英

在stl容器上使用Emplace_back而不是push_back?

[英]Emplace_back instead of push_back on stl containers?

我不太确定我是否总是可以用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从构造函数参数中显式构造元素。

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

#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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM