将向量放入映射表中

12

给定这个类型:

std::map<int, std::vector<T>> map;

如何直接插入元素?

map.emplace(10, /* ? */);

我可以先单独创建向量,然后在调用emplace时使用该标识符来完成,但如果有可能直接完成,那么这种方法是不理想的。


相关(可能是重复的):https://dev59.com/j4jca4cB1Zd3GeqPrRBA - rici
2个回答

8
双方
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 Duck
@MooingDuck:是的,我也这么认为。问题是它是gcc中的一个bug还是gcc捆绑的标准库中的bug,或者标准允许它。我似乎已经搞砸了我的clang安装,所以无法测试。 - rici
@MooingDuck:谢谢。根据https://dev59.com/j4jca4cB1Zd3GeqPrRBA#28634397,问题在于花括号初始化列表无法进行完美转发。 - rici
值得注意的是,map.insert 没有这个问题。 - Mooing Duck
1
@MooingDuck:这增加了关于它与转发有关的说法的可信度。map.insert不需要转发,因此它可以让std::vector使用隐式转换构造。 - rici

4

使用 piecewise_constructstd::make_tuple


map.emplace(std::piecewise_construct, std::make_tuple(5), std::make_tuple(10, 3));

6
不要说C++不直观,也不要说它使你的计算机程序难以阅读。_:滑稽:_ - Lightness Races in Orbit
1
很明显的意图是用一个包含10个元素的向量来初始化map[5],每个元素都被初始化为3。对吗? - rici
1
我收回我之前说的关于直接放置更可取的观点。 - Anonymous Entity
这个例子没有涵盖当您想将一个原始指针传递给向量时的情况。它应该 :) - Paiusco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接