【问题标题】:Avoid unnecessary constructor calls while inserting element to std::unordered_map?在向 std::unordered_map 插入元素时避免不必要的构造函数调用?
【发布时间】:2026-01-01 10:30:01
【问题描述】:

假设我有std::unordered_map < int, std::vector< int > > my_hashtable ,我插入一个新条目:

my_hashtable.insert(make_pair(a_key, std::vector()));

这可行,但它会多次调用构造函数和赋值操作。 (1) std::vector(), (2) make_pair 参数按值传递,复制 (3) make_pair 按值返回类型,再次复制 (4) 函数插入将再次复制。

如果算错了请指正。

因此,我们制作了太多副本,我们真的应该只调用一次构造函数,我们如何实现(在 C++11 下)?

我注意到 std::unordered_map::insert 有一个使用移动构造函数的版本,但不知道如何使用它。

【问题讨论】:

    标签: c++ c++11 stl


    【解决方案1】:

    你可以查看std::unordered_map::emplace()的例子:

    my_hashtable.emplace(
       std::piecewise_construct,
       std::forward_as_tuple(a_key),
       std::forward_as_tuple()
    );
    

    这里没有不必要的构造函数调用。

    【讨论】:

    • 这正是我要找的:)
    【解决方案2】:

    问题是映射的 value_type 的签名:它是std::pair<map::key_type, map::mapped_type>,其中键类型是 const 限定的。

    这将消除复制/移动:

    typedef std::unordered_map < int, std::vector< int > > hash_table:
    my_hashtable.insert(hash_table::value_type(a_key, std::vector()));
    

    您的示例中 make_pair 结果的签名可能是 std::pair&lt;int, vector&lt;...&gt; &gt; 而不是 std::pair&lt;const int, vector&lt;...&gt; &gt;

    【讨论】:

      最近更新 更多