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

C++ STL映射与向量的迭代器访问性能?,c++,performance,stl,map,iterator,C++,Performance,Stl,Map,Iterator,使用迭代器循环STL映射与使用向量之间的性能差异是什么?我想使用map键进行插入、删除和一些访问,但我还需要定期访问map中的每个元素。如果需要通过该键进行快速访问,请使用map。否则,请始终使用vector,除非探查器会发现某些性能问题 遍历映射的每个元素需要O(n)个时间 浏览树并不昂贵(grosso modo类似于跟踪链表),你不会像使用向量一样从缓存中获益,但通常情况下,你迭代时所做的事情是昂贵的,而不是迭代本身 你能告诉我们当你迭代整个地图时你希望做什么吗?对于地图和向量,迭代整个集合

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

如果需要通过该键进行快速访问,请使用map。否则,请始终使用vector,除非探查器会发现某些性能问题

遍历映射的每个元素需要O(n)个时间

浏览树并不昂贵(grosso modo类似于跟踪链表),你不会像使用向量一样从缓存中获益,但通常情况下,你迭代时所做的事情是昂贵的,而不是迭代本身


你能告诉我们当你迭代整个地图时你希望做什么吗?

对于地图和向量,迭代整个集合是O(N)。然而(像列表vs向量)向量连续地存储元素,因此访问下一个元素要便宜得多,因为它将以最佳方式使用缓存,而映射不会

但由于您需要基于键进行查找,因此实际上没有其他选择。您可以使用在第一个元素上排序的对向量,但是如果集合需要可变,这将非常缓慢。只需使用map。

为所有STL容器上的各种操作提供了一个很好的性能表

一般来说,如果你需要根据一个键进行大量的插入、删除或搜索,那么地图就是最好的选择

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

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


迭代通过映射可以是线性的,但实际上,它从C++实现中不是很有效。因此,我的建议是使用一个向量,然后使用另一个地图在线性时间内定位向量中的项目。

这个问题有一个微妙之处。用户不希望访问一个元素,而是希望访问映射中的所有元素。摊销成本分析得出整个地图横向的O(N)(树中的每条边只横向两次,一次向下,一次向上)。链接断开。我想应该是:为什么向量的插入头是n/a而向量的移除头是O(1)?它们都应该是O(n)。向量find是O(logn)?这里有点不对劲。我不知道为什么人们会对此进行投票,这个表似乎是假的。我们真正需要知道的是,“在什么情况下使用
映射
比使用
向量
(分别用于删除和循环迭代)更有效?”对映射中每个元素的访问更重要,因为它会频繁地触发,但我仍然需要相当快速的基于键的查找(我可以去掉这个要求,但事情会变得不合理地复杂)。根据格雷格·罗杰斯(Greg Rogers)上面的回答,地图似乎更合适。