【发布时间】:2019-05-29 11:37:26
【问题描述】:
我想在std::unordered_map 上找到一个带有键的元素,或者如果它尚不存在则插入它。
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 之前做出这种权衡?
【问题讨论】: