【发布时间】:2015-02-27 17:15:05
【问题描述】:
鉴于这种类型:
std::map<int, std::vector<T>> map;
如何直接放置元素?
map.emplace(10, /* ? */);
我可以通过先单独创建向量,然后在调用 emplace 时使用该标识符来做到这一点,但如果可以以某种方式直接做到这一点,这是不可取的。
【问题讨论】:
标签: c++ dictionary vector
鉴于这种类型:
std::map<int, std::vector<T>> map;
如何直接放置元素?
map.emplace(10, /* ? */);
我可以通过先单独创建向量,然后在调用 emplace 时使用该标识符来做到这一点,但如果可以以某种方式直接做到这一点,这是不可取的。
【问题讨论】:
标签: c++ dictionary vector
两者
map.emplace(typename decltype(map)::value_type(10, {1, 2, 3}));
和
map.emplace(10, std::initializer_list<int>{1, 2, 3});
应该可以正常工作。
我确信 gcc 拒绝我的第一次尝试是有原因的:
map.emplace(10, {1, 2, 3});
但我不知道这是一个好的理由还是一个缺陷。
编辑:这似乎与花括号初始化列表 ({1, 2, 3}) 没有类型有关,因此无法与完美转发一起使用(这对于map.emplace)。关于这一点有几个相关的 SO 帖子,例如this answer。
【讨论】:
emplace 有很多魔法可以使“重载”工作,因此它无法正确推断类型。
map.insert没有这个问题。
map.insert 不需要转发,所以它可以让 std::vector 构造一个隐式转换。
将piecewise_construct 与std::make_tuple 一起使用:
map.emplace(std::piecewise_construct, std::make_tuple(5), std::make_tuple(10, 3));
【讨论】:
map[5],每个元素都初始化为 3。对吗?