为什么要使用无序容器?(C++)
Why use an unordered container? (C++)
我已经尝试搜索这个,但没有找到任何东西。
我正在学习 STL 容器,并了解顺序和关联容器的优缺点,但是不确定为什么有人更喜欢无序容器而不是关联容器,因为它肯定不会影响元素插入、查找和删除。
这纯粹是一个性能问题,即插入/删除到关联容器需要更多的处理,因为它必须经过排序?我对系统方面的事情不太了解,但在我的脑海中,我觉得无序容器比自动组织的容器需要更多的"维护"。
如果有人能提供一些启示,将不胜感激。
纯粹抽象地说,考虑这样一个事实,即元素的排序是您必须付费的额外"功能",因此如果您不需要它(例如在仅查找字典中),那么您不必为此付费。
从技术上讲,这意味着通过使用哈希表,可以以预期的查找和插入复杂度 O(1) 实现无序容器,而不是有序容器的 O(log n)。
但是,在切线相关的说明中,使用字符串作为键时具有巨大的实际优势:有序容器必须在树形行走的任何地方执行完整的字符串比较,而哈希容器仅执行单个哈希操作(甚至可以"优化"为仅从非常长的字符串中采样固定数量的字符), 在实践中往往要快得多。
如果不需要排序,那么最好的办法是尝试两种容器类型(其接口几乎相同),并比较使用情况配置文件中的性能。
当不需要对象的排序并且您最关心对象查找的性能时,我们使用无序容器,因为无序容器在任何地方都有最快的搜索/插入是 O(1) 而不是有序容器(关联容器需要 O(log n))和序列容器需要 O(n))。
不知道为什么有人更喜欢无序容器而不是关联容器
这些功能不是排他性的。 容器可以是关联的,如果是,则单独也可能是无序的。
如果您熟悉哈希映射,那就是无序容器所利用的技术。 标准库使用术语"无序"而不是"哈希",以便在所需的只是特定的性能承诺时不会强加特定技术。(见评论)
- 递归无序映射
- c++找不到具有相同哈希的无序集合元素
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 如何使用set实现无序数据结构?
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 如何禁用 CPU 的无序执行
- 从C++无序集合中高效提取元素
- 打印无序映射的第二个元素,即集合
- 当我将其插入无序地图时,矢量的容量为 0
- 代码块中无序多集的编译错误17.12
- 由并发无序映射查找线程调用的函数是否安全?
- 如何按值对无序哈希映射进行排序
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 如何将一个单词拆分成字母,并将它们放入一个无序的列表/集合中
- 将大型对象存储在无序映射中是否效率低下
- 仅从无序集合中删除一个项目