c++ - 对于对象图,我可以放置对象还是成对放置对象?

标签 c++ c++11 hashmap multimap emplace

我使用的是 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/

相关文章:

c++ - 在 C++ 中使用密码实现的基本 MCrypt 字符串加密

c++ - gcc 中的模板显式实例化(定义和声明)

c++ - 模板模板参数的部分实例化

java - HashMap、LinkedHashMap 和 ConcurrentHashMap 在创建 Map 和基于特定键获取值时的执行成本

java - 如何强制HashMap使用identity(哈希码)?或建议解决方法

c++ - 嵌套类和继承 C++

c++ - 为什么 GCC 不允许我将模板参数用于另一个模板的参数?

c++ - 在 C++ 中按空格拆分字符串的最快方法

c++ - 前向声明模板函数的必要性

java - 如何迭代整个 HashMap