对于物体的地图,我可以放置物体,还是只配对?

时间:2014-03-23 02:05:17

标签: c++ c++11 hashmap multimap emplace

我使用的是C ++ 11和gcc-4.7.0。我正在寻找STL解决方案。

我想要一个未分类的多图,其中包含myClass的对象,短字符串作为键。在我构造它们时,Emplace看起来是将对象放入地图的好方法,但是我不确定它是否可以这样做,或者它是否只构造键/对象。 这应该是有效的:

table.emplace(myKey, myClass(arg1, arg2, arg3));

但是,执行以下操作会更有效吗,它甚至是有效的代码吗?

table.emplace(myKey, arg1, arg2, arg3);

1 个答案:

答案 0 :(得分:7)

根据thisgcc-4.7并不完全支持emplace()

gcc-4.8完全支持emplace(),但需要稍微不同的语法:

table.emplace(std::piecewise_construct, std::forward_as_tuple(myKey), std::forward_as_tuple(arg1, arg2, arg3));

而不是

table.emplace(myKey, arg1, arg2, arg3); // Does not work.

要使forward对rvalue生效,可以使用std::move()来包围参数。

因此它将直接在容器中构建键和值。

对于std::piecewise_construct构造函数的特殊用法,

std::pairargument。它将要求构造函数将参数单独转发给底层构造函数。

这实际上是关联容器的emplace()问题。最初的意图是使用key的第一个参数,以及值的以下参数,就像问题中描述的那样。有关此问题的详细信息,请参阅this

感谢Zeta指出forward问题。