避免使用std::unordered_map(和其他)进行重复搜索或不必要的构造
Avoid double search or unecessary construction with std::unordered_map (and others)
我想在std::unordered_map
上找到一个带有键的元素,或者如果它还不存在,请插入它。
从 cppreference.com:
std::unordered_map::emplace
如果容器中没有带键的元素,则将新元素插入到使用给定参数就地构造的容器中。
。
即使容器中已经存在带有键的元素,也可以构造该元素,在这种情况下,新构造的元素将立即销毁。
。
返回一对,其中包含插入元素的迭代器,如果未发生插入,则返回已存在的元素,以及指示插入是否已发生的布尔值。如果插入为 true,则为 false,表示不插入。
我已经针对我的环境对其进行了测试,即使已经存在相同的键,它实际上也会构造元素。
这可能是一个主要的性能问题。
从 c++17 开始,如果不插入,则有try_emplace
可以避免这种构造。
我仅限于 c++14,在环顾四周后,我找到了相同行为的两种选择:
首先使用
std::unordered_map::find
,如果元素不存在,则使用std::unordered_map::emplace
。如果密钥不存在,我将为冗余容器搜索付费。使用
std::unordered_map::emplace
.如果密钥存在,我会为不必要的对象构建和破坏付费。
我的假设是否正确,我必须在 C++17 之前决定这种权衡?
我的假设是否正确,我必须在 C++17 之前决定这种权衡?
是的。
或者,可以使用标准库之外支持try_emplace
操作或等效操作的容器。
相关文章:
- 用callgrind追踪不必要的副本
- 不必要的C++代码最终会出现在我完成的程序中吗?
- 总和的不必要行为C++?
- 二叉搜索不收敛为双倍
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 如何在插入排序中使用 replace() 使语句变得不必要
- C 包装器C++库周围没有不必要的头文件
- 编译器是否消除了不必要的原子?
- 在 c++ 中不必要的包含
- GCC为AVR上的简单ISR产生不必要的寄存器推送
- 在序列化过程中删除不必要的内存分配
- QTREEWIDGET子分类,停止下降指示器显示给定有不必要的DropIndicatorPosition
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 如何在不指定不必要的模板参数的情况下使用模板类的成员类型
- Android Gradle避免了CMake项目不必要的重建
- 避免使用std::unordered_map(和其他)进行重复搜索或不必要的构造
- 二进制搜索不变以查找元素的首次出现
- 摆脱可变参数模板递归基本情况下不必要的类