我想在std::unordered_map
上找到一个带有键的元素,或者将其插入(如果尚不存在的话)。
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之前就此权衡一下?
答案 0 :(得分:2)
我的假设是正确的,我必须在C ++ 17之前就此权衡一下?
是的
或者,您可以在标准库之外使用支持try_emplace
操作或等效操作的容器。