给定这个类型:
std::map<int, std::vector<T>> map;
如何直接插入元素?
map.emplace(10, /* ? */);
我可以先单独创建向量,然后在调用emplace时使用该标识符来完成,但如果有可能直接完成,那么这种方法是不理想的。
给定这个类型:
std::map<int, std::vector<T>> map;
如何直接插入元素?
map.emplace(10, /* ? */);
我可以先单独创建向量,然后在调用emplace时使用该标识符来完成,但如果有可能直接完成,那么这种方法是不理想的。
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问题,比如这个答案。
emplace
有很多魔法使得“重载”能够工作,因此它无法正确推断类型。 - Mooing Duckmap.insert
没有这个问题。 - Mooing Duckmap.insert
不需要转发,因此它可以让std::vector
使用隐式转换构造。 - rici使用 piecewise_construct
和 std::make_tuple
:
map.emplace(std::piecewise_construct, std::make_tuple(5), std::make_tuple(10, 3));
map[5]
,每个元素都被初始化为3。对吗? - rici