簡體   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