避免使用std::unordered_map(和其他)进行重复搜索或不必要的构造

Avoid double search or unecessary construction with std::unordered_map (and others)

本文关键字:搜索 不必要 其他 std unordered map      更新时间:2023-10-16

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

从 cppreference.com:

std::unordered_map::emplace

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

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

返回一对,其中包含插入元素的迭代器,如果未发生插入,则返回已存在的元素,以及指示插入是否已发生的布尔值。如果插入为 true,则为 false,表示不插入。

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

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

从 c++17 开始,如果不插入,则有try_emplace可以避免这种构造。

我仅限于 c++14,在环顾四周后,我找到了相同行为的两种选择:

  • 首先使用std::unordered_map::find,如果元素不存在,则使用std::unordered_map::emplace。如果密钥不存在,我将为冗余容器搜索付费。

  • 使用std::unordered_map::emplace.如果密钥存在,我会为不必要的对象构建和破坏付费。

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

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

是的。

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