STL映射与向量的迭代器访问性能?

11 c++ performance iterator stl map

使用迭代器循环STL映射与向量之间的性能差异是什么?我想使用map键进行插入,删除和一些访问,但我还需要定期访问map中的每个元素.

Gre*_*ers 19

使用map和vector,遍历整个集合的是O(N).然而(像列表与矢量一样)矢量连续存储元素,因此访问下一个元素要便宜得多,因为它将最佳地使用缓存,而地图则不会.

但由于您需要基于密钥进行查找,因此没有其他选择.你可以使用在第一个元素上排序的对向量,但如果集合需要是可变的,那么这将是非常慢的.只需使用地图.


San*_*a R 9

迭代地图的每个元素需要O(n)时间.维基百科


17 *_* 26 7

此链接有一个很好的性能表,可用于所有STL容器上的各种操作.

一般来说,如果您需要根据密钥进行大量插入,删除或搜索,那么地图就是您的选择.

如果您只需要设置一次容器然后像数组一样访问它,那么使用向量.

编辑:STL容器操作的性能表:

在此输入图像描述

  • 我不知道为什么人们对此表示赞同,表似乎是假的. (4认同)
  • 链接坏了.我想它应该是:http://devmentor.org/references/stl/stl.php (3认同)
  • 为什么插入矢量的头是n/a并且为矢量移除头是O(1)?它们都应该是O(n).矢量查找是O(log n)?那里有些不对劲. (3认同)
  • 这个问题有一个微妙之处。用户不想访问一个元素,而是想访问地图中的_所有_元素。摊销成本分析为整个地图横向产生 O(N)(树中的每条边仅横向两次,一次向下,一次向上)。 (2认同)

小智 5

遍历映射可能是线性的,但实际上,从 C++ 中的实现来看,效率并不高。所以我的建议是使用一个向量并使用另一个地图在线性时间内定位向量中的项目。