C++ 避免使用std::unordered_映射(和其他映射)进行双重搜索或不必要的构造

C++ 避免使用std::unordered_映射(和其他映射)进行双重搜索或不必要的构造,c++,c++14,C++,C++14,我想在std::unordered_map上找到一个带有键的元素,如果它还不存在,就插入它 发件人: 标准::无序地图::安放 如果容器中没有包含键的元素,则将新元素插入使用给定参数就地构造的容器中 即使容器中已经存在具有密钥的元素,也可以构造该元素,在这种情况下,新构造的元素将立即被销毁 返回一个由迭代器组成的对,该迭代器指向插入的元素,如果没有插入,则返回已存在的元素,并返回一个bool,指示插入是否发生。对于插入,为True;对于不插入,为False 我已经在我的环境中对它进行了测试,

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

发件人:

标准::无序地图::安放

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

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

返回一个由迭代器组成的对,该迭代器指向插入的元素,如果没有插入,则返回已存在的元素,并返回一个bool,指示插入是否发生。对于插入,为True;对于不插入,为False

我已经在我的环境中对它进行了测试,它实际上构造了元素,即使同一个键已经存在

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

在c++17中有一个
try_emplace
,如果没有插入,它可以避免这种构造

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

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

  • 使用
    std::无序地图::安放
    。如果键存在我会为一个不必要的对象的构建和销毁支付费用

我的假设正确吗?我必须在C++17之前决定这个权衡

我的假设正确吗?我必须在C++17之前决定这个权衡


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

事实上,这正是添加
try\u emplace
的原因。