【问题标题】:Avoid double search or unecessary construction with std::unordered_map (and others)避免使用 std::unordered_map (和其他)进行双重搜索或不必要的构造
【发布时间】:2019-05-29 11:37:26
【问题描述】:

我想在std::unordered_map 上找到一个带有键的元素,或者如果它尚不存在则插入它。

来自cppreference.com

std::unordered_map::emplace

如果容器中没有带有键的元素,则将新元素插入到使用给定参数就地构造的容器中。

...

即使容器中已经有一个带有key的元素,也可以构造该元素,在这种情况下,新构造的元素将被立即销毁。

...

返回一个由插入元素的迭代器组成的对,如果没有插入,则返回已经存在的元素,以及一个表示插入是否发生的布尔值。插入为真,无插入为假。

我已经针对我的环境对其进行了测试,即使相同的键已经存在,它也会实际构建元素。

这可能是一个主要的性能问题。

从 c++17 开始,try_emplace 会在不发生插入时避免这种构造。

我仅限于 c++14,环顾四周后,我发现了相同行为的两种替代方法:

  • 首先使用std::unordered_map::find,如果元素不存在则使用std::unordered_map::emplace。如果 key 不存在,我会支付 冗余容器搜索

  • 使用std::unordered_map::emplace。如果 key 存在,我会为 不必要的对象构造和销毁付费。

我的假设是否正确,我必须在 C++17 之前做出这种权衡?

【问题讨论】:

    标签: c++ c++14


    【解决方案1】:

    我的假设是否正确,我必须在 C++17 之前做出这种权衡?

    是的。

    或者,您可以使用支持try_emplace 操作或等效操作的标准库之外的容器。

    【讨论】:

    • 确实,这就是添加try_emplace 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多