首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unordered_set在unordered_map中的嵌入

unordered_set在unordered_map中的嵌入
EN

Stack Overflow用户
提问于 2015-06-24 07:43:37
回答 4查看 3.6K关注 0票数 4

如何将(静态定义的) unordered_set添加到unordered_map中,而不必复制unordered_set?

我试过这个:

代码语言:javascript
复制
std::unordered_map<int, std::unordered_set<std::string>> my_map;
for (int i=0; i<100; i++)
  my_map.emplace(i, {"foo", "bar"});

这是:

代码语言:javascript
复制
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"})));

但是它们都没有编译,我得到了这些错误(分别):

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

代码语言:javascript
复制
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)’
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-24 07:57:13

大括号初始化是一个边缘情况下,完美转发不是那么完美的。

问题是传递给函数模板参数的带括号的初始化器在一个非推导的上下文中,编译器不允许为它们推断一个类型。

幸运的是,修复非常容易:只需明确说明std::initializer_list的使用即可。

代码语言:javascript
复制
my_map.emplace(i, std::initializer_list<std::string>{"foo", "bar"});

解决这个问题的通常方法是做以下事情:

代码语言:javascript
复制
auto list = { "foo", "bar" };
my_map.emplace(i, list);

但这对std::string不起作用,因为decltype(list)被推断为std::initializer_list<const char*>

票数 9
EN

Stack Overflow用户

发布于 2015-06-24 07:56:51

地图的元素( mapunordered_map)都是using value type = std::pair<key_t, mapped_type>型。因此,emplace不会将其参数传递给unordered_set<string>构造函数!

一旦您意识到这一点,解决方案就是简单

代码语言:javascript
复制
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"});
票数 2
EN

Stack Overflow用户

发布于 2015-06-24 07:57:33

您可以使用以下代码:

代码语言:javascript
复制
for (int i=0; i<100; i++)
  my_map.emplace(i, std::unordered_set<std::string>({"foo","bar"}));

它将将无序集移动到无序地图中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31020634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档