6

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

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

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

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

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

1 回答 1

9

据此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使右值生效,可以使用std::move()环绕参数。

因此它将直接在容器中适当地构造键和值。

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

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

感谢 Zeta 指出forward问题。

于 2014-03-23T02:16:15.380 回答