我使用的是 C++ 11 和 gcc-4.7.0。我正在寻找 STL 解决方案。
我想要一个未排序的 multimap ,其中包含以短字符串作为键的 myClass 对象。 Emplace 看起来是一种在我构建对象时将对象放入 map 的好方法,但我不确定它是否可以这样做,或者它是否只会构建键/对象对。 这应该是有效的:
table.emplace(myKey, myClass(arg1, arg2, arg3));
但是执行以下操作会更有效率吗,它甚至是有效代码吗?
table.emplace(myKey, arg1, arg2, arg3);
最佳答案
根据 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
对右值生效,可以使用 std::move()
环绕参数。
因此它将直接在容器中就地构造键和值。
std::piecewise_construct
是一个 argument std::pair
构造函数的特殊用法。它会要求构造函数将参数单独转发给底层构造函数。
这实际上是关联容器的 emplace()
问题。最初的意图是使用第一个参数作为键,然后使用以下参数作为值,就像问题中描述的那样。参见 this有关此问题的更多详细信息。
感谢 Zeta 指出 forward
问题。
关于c++ - 对于对象图,我可以放置对象还是成对放置对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586186/