簡體   English   中英

std::map emplace 不復制值

[英]std::map emplace without copying value

C++11 std::map<K,V>類型有一個emplace函數,許多其他容器也是如此。

std::map<int,std::string> m;

std::string val {"hello"};

m.emplace(1, val);

這段代碼按照宣傳的方式工作,直接放置std::pair<K,V> ,但它會生成keyval的副本。

是否也可以將值類型直接放入地圖中? 我們能比將調用中的參數移動到emplace做得更好嗎?


這是一個更徹底的例子:

struct Foo
{
   Foo(double d, string s) {}
   Foo(const Foo&) = delete;
   Foo(Foo&&) = delete;
}

map<int,Foo> m;
m.emplace(1, 2.3, string("hello")); // invalid

您傳遞給map::emplace的參數被轉發到map::value_type的構造函數,即pair<const Key, Value> 因此,您可以使用std::pair分段構造構造函數來避免中間復制和移動。

std::map<int, Foo> m;

m.emplace(std::piecewise_construct,
          std::forward_as_tuple(1),
          std::forward_as_tuple(2.3, "hello"));

現場演示

在 C++17 中,這可以通過try_emplace方法更容易地實現。

map<int,Foo> m;
m.try_emplace(1, 2.3, "hello");

標准庫中的這一新增內容在論文 N4279 中進行了介紹,並且應該已經在Visual Studio 2015GCC 6.1LLVM 3.7 (libc++ 庫)中得到支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM