向量与列表插入性能

时间:2014-05-18 05:12:00

标签: c++ performance c++11 vector stl

我刚观看了Herb Sutter的演讲(见http://channel9.msdn.com/Events/Build/2014/2-661上的第46页)关于各种STL收容人表演的演讲。看起来std::vectorstd::list更快,即使插入中间,看起来像是一个很大的NO-NO ......他的解释是,这是因为连续的内存分配std::vector,因为线性横向似乎超快。我现在很好奇,有没有人在实际代码中观察到两者之间可见的性能差异?我不是一个专业的程序员,我只是在我的笔记本电脑上测试了一个简单的例子,似乎确实std::vector插入的速度比std::list快。这看起来有点奇怪......我想理解为什么矢量在STL实现中更快,

1 个答案:

答案 0 :(得分:2)

由于您没有提供代码示例,我将提供一些可能的原因。

  1. std::list执行一次动态内存分配插入,动态内存分配是一项昂贵的操作。 std::list还需要花费O(n / 2)时间来查找中间元素,因为它必须遵循指针而不是仅仅添加一个指针。
  2. std::vector会要求将列表末尾的所有元素向右移动,这可能与std::list的遍历时间相似或更快。此外,std::vector每当资源用完时,其大小往往会翻倍,因此与O(log n)的{​​{1}}分配相比,它仅使用O(n)次重新分配。
  3. 如果您开始使用更大尺寸的每个容器进行测量,我认为您可能会了解有关复制成本与遍历成本的有趣信息。例如,2000万个元素。


    此外,正如LightnessRacesinOrbit正确指出的那样,std::list仅表示恒定时间,而O(1)表示与输入大小成比例的时间,但这些时间界限不一定转化为实际测量的时间,尤其是对于小尺寸输入,因为O(n)时间可能隐藏一个大常量。

    但是,我认为对于这个特定的问题,列表遍历可能是罪魁祸首,因为它会导致O(1)遍历时间以便插入到列表的中间。