std :: vector和std :: list find_if和max_element性能

时间:2013-06-12 21:21:27

标签: c++ list vector stl

我对我为std::vectorstd::list测试的代码的性能感到困惑。这两者在find_ifmax_element

方面有区别吗?

3 个答案:

答案 0 :(得分:7)

就big-O表示法而言,两者都具有相同的O(n)性能。 (如果更早找到元素,find_if可以更少,但对于两个容器也是如此。)

就实际挂钟时间而言,由于高速缓存一致性,矢量将表现更好;所有向量元素都在内存中是顺序的,因此访问它们将更好地利用CPU缓存。链表的元素可以分散在整个内存中,您还需要遵循需要时间的列表链接。

答案 1 :(得分:4)

两种算法在计算复杂性方面都是O(n),但是向量在连续的存储区域中分配它们的元素,这很可能导致更高的高速缓存命中率。另一方面,遍历列表涉及分散的内存访问模式,这种模式更有可能导致更高的缓存未命中率。

总是在性能方面,无论如何,在做出决定之前都要进行测量。

答案 2 :(得分:0)

对于max_element,将遍历列表和数组的所有元素。因此,就性能而言,两者都是O(n)。

再次对于find_if,两个数据结构的遍历将是线性的(O(n))。

除了相对于每个常数的常数之外,我认为不应该有太大差异。

相关问题