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

Qaz*_*Qaz 4 c++ hashmap multimap c++11 emplace

我正在使用C++ 11和gcc-4.7.0.我正在寻找一个STL解决方案.

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

table.emplace(myKey, myClass(arg1, arg2, arg3));
Run Code Online (Sandbox Code Playgroud)

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

table.emplace(myKey, arg1, arg2, arg3);
Run Code Online (Sandbox Code Playgroud)

WiS*_*GaN 7

根据这个,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));
Run Code Online (Sandbox Code Playgroud)

代替

table.emplace(myKey, arg1, arg2, arg3); // Does not work.
Run Code Online (Sandbox Code Playgroud)

为了forward使rvalue生效,可以使用std::move()包围参数.

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

std::piecewise_construct是构造函数的特殊用法的参数std::pair.它将要求构造函数将参数单独转发给底层构造函数.

这实际上是emplace()关联容器的问题.最初的意图是使用key的第一个参数,以及值的以下参数,就像问题中描述的那样.请参见关于这个问题的进一步的细节.

感谢Zeta指出forward问题.

  • 如果你追求效率,你可能想要使用`forward_as_tuple`而不是`make_tuple`,但是,请记住通常的'forward`相关的事情. (2认同)