[英]emplace and unordered_map<?, std::array<?, N>>
我有一个std::unordered_map<string, std::array<int, 2>>
。 什么是语法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}});
我正在使用clang++ -c -x c++ -std=c++14
和clang 3.6.0
我在http://ideone.com/pp72yR中测试了代码
附录:Nathan Oliver在以下答案中建议了(4)
从cppreference std::unordered_map::emplace
声明为
template< class... Args >
std::pair<iterator,bool> emplace( Args&&... args );
因此,它试图推断传递给它的类型。 这发挥了作用[temp.deduct.type]§14.8.2.5
—与关联参数为初始值设定项列表(8.5.4)的函数参数,但该参数不具有为其指定初始值设定项列表的推导的类型(14.8.2.1)。 [示例:
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
—末例]
因此无法推断出任何类型。
如果要动态创建对象,则可以使用以下形式:
contig_sizes.emplace(key, std::array<int, 2>{1, 2});
或者我们可以创建一个typedef
typedef pair<const string, array<my_class, 2>> pair_type;
然后我们可以有
contig_sizes.emplace(pair_type{key, {1, 2}});
您还可以使用std::unordered_map::insert
,它采用一pair
键/值,这些键/值可以从大括号的初始化程序列表中构造。
contig_sizes.insert({key, {1, 2}});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.