4

unordered_set をコピーせずに、(静的に定義された) unordered_set を unordered_map に追加するにはどうすればよいですか?

私はこれを試しました:

std::unordered_map<int, std::unordered_set<std::string>> my_map;
for (int i=0; i<100; i++)
  my_map.emplace(i, {"foo", "bar"});

この:

std::unordered_map<int, std::unordered_set<std::string>> my_map;
for (int i=0; i<100; i++)
  my_map.insert(i, std::move(std::unordered_set<std::string>({"foo", "bar"})));

しかし、どれもコンパイルされません。(それぞれ)次のエラーが発生します。

error: no matching function for call to ‘std::unordered_map<int, std::unordered_set<std::basic_string<char> > >::emplace(int&, <brace-enclosed initializer list>)’

error: no matching function for call to ‘std::unordered_map<int, std::unordered_set<std::basic_string<char> > >::insert(int&, std::remove_reference<std::unordered_set<std::basic_string<char> > >::type)’
4

4 に答える 4

9

ブレース初期化子は、完全な転送がそれほど完璧ではないエッジ ケースの 1 つです。

問題は、関数テンプレート パラメーターに渡された波括弧付きの初期化子が推定されないコンテキストにあり、コンパイラがそれらの型を推定することを許可されていないことです。

幸いなことに、修正は非常に簡単ですstd::initializer_list

my_map.emplace(i, std::initializer_list<std::string>{"foo", "bar"});

この問題を解決する通常の方法は、次のようにすることです。

auto list = { "foo", "bar" };
my_map.emplace(i, list);

しかし、これはstd::stringsでは機能しません。decltype(list)std::initializer_list<const char*>

于 2015-06-24T07:57:13.227 に答える
2

マップの要素 (mapとの両方unordered_map) のタイプはusing value type = std::pair<key_t, mapped_type>です。したがって、emplace引数をunordered_set<string>コンストラクターに渡しません!

それを理解したら、解決策は簡単です:

std::unordered_map<int, std::unordered_set<std::string>> my_map;
for (int i=0; i<100; i++)
    my_map.emplace(i, std::unordered_set<std::string>{"foo", "bar"});
于 2015-06-24T07:56:51.547 に答える
2

次のコードを使用できます。

for (int i=0; i<100; i++)
  my_map.emplace(i, std::unordered_set<std::string>({"foo","bar"}));

順序なしセットを順序なしマップに移動します。

于 2015-06-24T07:57:33.567 に答える
1

に何かを挿入するにはstd::map<Key, Value>std::pair<Key, Value>

変化する:

my_map.insert(i, std::move(std::unordered_set<std::string>({"foo", "bar"})));

の中へ:

my_map.insert( std::make_pair(i, std::unordered_set<std::string>({"foo", "bar"})));

そして、あなたは行く準備ができているはずです。

于 2015-06-24T07:57:04.097 に答える