如何将(静态定义的) unordered_set添加到unordered_map中,而不必复制unordered_set?
我试过这个:
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)’发布于 2015-06-24 07:57:13
大括号初始化是一个边缘情况下,完美转发不是那么完美的。
问题是传递给函数模板参数的带括号的初始化器在一个非推导的上下文中,编译器不允许为它们推断一个类型。
幸运的是,修复非常容易:只需明确说明std::initializer_list的使用即可。
my_map.emplace(i, std::initializer_list<std::string>{"foo", "bar"});解决这个问题的通常方法是做以下事情:
auto list = { "foo", "bar" };
my_map.emplace(i, list);但这对std::string不起作用,因为decltype(list)被推断为std::initializer_list<const char*>。
发布于 2015-06-24 07:56:51
地图的元素( 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-24 07:57:33
您可以使用以下代码:
for (int i=0; i<100; i++)
my_map.emplace(i, std::unordered_set<std::string>({"foo","bar"}));它将将无序集移动到无序地图中。
https://stackoverflow.com/questions/31020634
复制相似问题