13

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

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

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

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

4

3 回答 3

10

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

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

不过,在切线相关的注意事项上,使用字符串作为键有一个巨大的实际优势:有序容器必须在树遍历的任何地方执行完整的字符串比较,而散列容器只执行单个散列操作(甚至可以“优化”以仅从非常长的字符串中采样固定数量的字符),并且在实践中通常会更快。

如果订购不是必需的,那么最好的办法是尝试两种容器类型(其界面几乎相同)并在您的使用配置文件中比较性能。

于 2013-01-25T20:27:08.590 回答
3

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

于 2016-11-30T10:31:17.610 回答
2

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

这些功能不是独有的。一个容器可以是关联的,如果是,单独的也可以是无序的。

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

于 2013-01-25T20:24:53.507 回答