3

私は持っていstd::unordered_map<string, std::array<int, 2>>ます。emplaceマップに値を ing する構文は何ですか?

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++143.6.0を使用してclangしています

http://ideone.com/pp72yRでコードをテストしました

補遺: (4) は、以下の回答で Nathan Oliver によって提案されました。

4

1 に答える 1

5

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::insertwhich を使用することもできます。pair

contig_sizes.insert({key, {1, 2}});
于 2015-10-06T15:03:04.583 に答える