对于对象的映射,我可以放置对象,或者只是成对

For a map of objects, can I emplace objects, or just pairs?

本文关键字:对象 或者 映射 于对象 我可以      更新时间:2023-10-16

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

我想有一个未排序的multimap,包含myClass的对象与短字符串作为键。Emplace看起来是一种将物体放入地图的好方法,但我不确定它是否能做到这一点,或者它是否只会构建键/对象对。这应该是有效的:

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

但是这样做会更有效率吗?它是有效的代码吗?

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

由此可见,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()将参数括起来。

所以它会在容器中直接构造key和value。

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

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

感谢Zeta指出forward问题

相关文章: