【问题标题】:For a map of objects, can I emplace objects, or just pairs?对于对象地图,我可以放置对象,还是只是配对?
【发布时间】:2014-04-30 10:32:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    根据thisgcc-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_constructargument 用于 std::pair 构造函数的特殊用法。它将要求构造函数将参数单独转发给底层构造函数。

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

    感谢 Zeta 指出forward 问题。

    【讨论】:

    • 如果您追求效率,您可能希望使用forward_as_tuple 而不是make_tuple,但是请记住通常的forward 相关内容。
    猜你喜欢
    • 2011-11-18
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2015-09-18
    • 2017-05-31
    相关资源
    最近更新 更多