为什么要使用无序容器?(C++)

Why use an unordered container? (C++)

本文关键字:C++ 无序 为什么      更新时间:2023-10-16

我已经尝试搜索这个,但没有找到任何东西。

我正在学习 STL 容器,并了解顺序和关联容器的优缺点,但是不确定为什么有人更喜欢无序容器而不是关联容器,因为它肯定不会影响元素插入、查找和删除。

这纯粹是一个性能问题,即插入/删除到关联容器需要更多的处理,因为它必须经过排序?我对系统方面的事情不太了解,但在我的脑海中,我觉得无序容器比自动组织的容器需要更多的"维护"。

如果有人能提供一些启示,将不胜感激。

纯粹抽象地说,考虑这样一个事实,即元素的排序是您必须付费的额外"功能",因此如果您不需要它(例如在仅查找字典中),那么您不必为此付费。

从技术上讲,这意味着通过使用哈希表,可以以预期的查找和插入复杂度 O(1) 实现无序容器,而不是有序容器的 O(log n)。

但是,在切

线相关的说明中,使用字符串作为键时具有巨大的实际优势:有序容器必须在树形行走的任何地方执行完整的字符串比较,而哈希容器仅执行单个哈希操作(甚至可以"优化"为仅从非常长的字符串中采样固定数量的字符), 在实践中往往要快得多。

如果不需要排序,那么最好的办法是尝试两种容器类型(其接口几乎相同),并比较使用情况配置文件中的性能。

当不需要对象的排序并且您最关心对象查找的性能时,我们使用无序容器,因为无序容器在任何地方都有最快的搜索/插入是 O(1) 而不是有序容器(关联容器需要 O(log n))和序列容器需要 O(n))。

不知道为什么有人更喜欢无序容器而不是关联容器

这些功能不是排他性的。 容器可以是关联的,如果是,则单独也可能是无序的。

如果您熟悉哈希映射,那就是无序容器所利用的技术。 标准库使用术语"无序"而不是"哈希",以便在所需的只是特定的性能承诺时不会强加特定技术。(见评论)