C++ 布设和无序地图<;?,std::数组<;?,N>&燃气轮机;

C++ 布设和无序地图<;?,std::数组<;?,N>&燃气轮机;,c++,dictionary,unordered-map,stdarray,emplace,C++,Dictionary,Unordered Map,Stdarray,Emplace,我有一张std::无序的地图。将值放入映射的emplace的语法是什么 unordered_map<string, array<int, 2>> contig_sizes; string key{"key"}; array<int, 2> value{1, 2}; // OK ---1 contig_sizes.emplace(key, value); // OK --- 2 contig_sizes.emplace(key, std::array<

我有一张
std::无序的地图
。将值放入映射的
emplace
的语法是什么

unordered_map<string, array<int, 2>> contig_sizes;
string key{"key"};
array<int, 2> value{1, 2};

// OK ---1
contig_sizes.emplace(key, value);

// OK --- 2
contig_sizes.emplace(key, std::array<int, 2>{1, 2});

// compile error --3
//contig_sizes.emplace(key, {{1,2}});

// OK --4 (Nathan Oliver)
// Very inefficient results in two!!! extra copy c'tor
contig_sizes.insert({key, {1,2}});

// OK --5
// One extra move c'tor followed by one extra copy c'tor
contig_sizes.insert({key, std::array<int, 2>{1,2}});

// OK --6 
// Two extra move constructors
contig_sizes.insert(pair<const string, array<int, 2>>{key, array<int, 2>{1, 2}});
无序地图重叠大小;
字符串键{“键”};
数组值{1,2};
//好的
重叠尺寸。安放位置(键、值);
//好的
模板(键,std::数组{1,2});
//编译错误--3
//重叠大小。安放(键,{1,2});
//好的——4(内森·奥利弗)
//非常低效的结果在两个!!!额外副本
插入({key,{1,2}});
//好,五
//一个额外的移动任务,然后是一个额外的副本任务
插入({key,std::array{1,2}});
//好的——6
//两个额外的移动构造函数
contig_size.insert(对{key,数组{1,2});

我使用的是CUC++-C-X+C++ +STD= C++ 14 和CLAN3.3.06/P> 我在中测试了代码

增编: (4) 由Nathan Oliver在下面的回答中提出,声明为

template< class... Args >
std::pair<iterator,bool> emplace( Args&&... args );
然后我们就可以

contig_sizes.emplace(pair_type{key, {1, 2}});
您还可以使用which来获取键/值的
,该键/值可以从带括号的初始值设定项列表中构造

contig_sizes.insert({key, {1, 2}});

emplace
需要推断其参数的类型,但是
{{1,2}
没有类型(它不是一个表达式)。
unordered_map::insert
会产生两个额外的复制参数()。要将其简化为仅移动命令,您似乎需要以下可怕的语法:
contig_size.insert(pair{key,array{1,2})
@LeoGoodstadt,可以通过简单的
typedef
解决<代码>类型定义对\u类型contig_size.insert(pair_type{key,{1,2})@LeoGoodstadt我更新了答案以显示易于使用的
emplace()
用法。我无法让它用
typedef
删除额外的副本。出于某种原因,我仍然需要
contig_size.emplace(pair_type{key,std::array{1,2}):-(这仍然不如我原来的
contig\u size.emplace(key,std::array{1,2});
!我还不如
typedef
值类型:
typedef std::array{1,2}value\u类型;
contig\u size.emplace(key,value\u类型{1,2})
@LeoGoodstadt你试过
contig size.emplace(pair\type{key,2}1,2});
typedef pair<const string, array<my_class, 2>> pair_type;
contig_sizes.emplace(pair_type{key, {1, 2}});
contig_sizes.insert({key, {1, 2}});