对于对象映射,我可以使用emplace函数添加对象吗,还是只能使用键值对?

6
我正在使用C++11和gcc-4.7.0。我正在寻找一个STL解决方案。
我想要一个包含myClass对象,以短字符串为键的未排序multimap。Emplace看起来是将对象放入map中并构造它们的好方法,但我不确定它是否可以这样做,或者它是否只能构造键/对象对。 以下代码应该是有效的:
table.emplace(myKey, myClass(arg1, arg2, arg3));

但是以下做法是否更加高效,并且它是否是有效的代码?
table.emplace(myKey, arg1, arg2, arg3);
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对rvalue生效,可以使用std::move()包装参数。

这样将直接在容器中按原地构造键和值。

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

这实际上是关于关联容器的emplace()问题。最初的意图是使用第一个参数作为key,后续的参数作为value,就像问题描述中所述。有关此问题的详细信息,请参见此处

感谢Zeta指出了forward问题。


2
如果你追求效率,你可能想使用forward_as_tuple而不是make_tuple,但是请记住通常与forward相关的事情。 - Zeta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接