我使用的是C ++ 11和gcc-4.7.0。我正在寻找STL解决方案。
我想要一个未分类的多图,其中包含myClass的对象,短字符串作为键。在我构造它们时,Emplace看起来是将对象放入地图的好方法,但是我不确定它是否可以这样做,或者它是否只构造键/对象。 这应该是有效的:
table.emplace(myKey, myClass(arg1, arg2, arg3));
但是,执行以下操作会更有效吗,它甚至是有效的代码吗?
table.emplace(myKey, arg1, arg2, arg3);
答案 0 :(得分:7)
根据this,gcc-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::pair
是argument。它将要求构造函数将参数单独转发给底层构造函数。
这实际上是关联容器的emplace()
问题。最初的意图是使用key的第一个参数,以及值的以下参数,就像问题中描述的那样。有关此问题的详细信息,请参阅this。
感谢Zeta指出forward
问题。