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::无序地图::安放
或者,您可以使用标准库之外支持
try\u emplace
操作或等效操作的容器。事实上,这正是添加try\u emplace
的原因。