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

时间:2019-05-29 11:37:27

标签: c++ c++14

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

来自cppreference.com

  

std :: unordered_map :: emplace

     

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

     

...

     

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

     

...

     

将一对由迭代器组成的对返回到插入的元素,如果没有插入发生,则返回已经存在的元素,并返回一个布尔值,表示是否发生了插入。插入时为True,不插入时为False。

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

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

从c ++ 17开始,try_emplace在没有插入的情况下避免了这种构造。

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

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

  • 使用std::unordered_map::emplace。如果密钥存在,我将支付不必要的对象构造和销毁

我的假设是正确的,我必须在C ++ 17之前就此权衡一下?

1 个答案:

答案 0 :(得分:2)

  

我的假设是正确的,我必须在C ++ 17之前就此权衡一下?

是的

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