std :: list应该被弃用吗?

时间:2012-12-08 17:06:36

标签: c++ performance vector containers doubly-linked-list

根据Bjarne Stroustrup的slides来自Going Native 2012 keynotestd::liststd::list的插入和删除在现代硬件上非常低效:

vector vs list

  

矢量节拍列表大量插入和删除

如果确实如此,那么{{1}}会留下什么用例?那不应该被弃用吗?

4 个答案:

答案 0 :(得分:23)

矢量和列表解决了不同的问题。 List提供了保证,当您插入和删除其他元素时,迭代器永远不会失效。 Vector无法保证。

它不仅仅是关于性能。所以答案是否定的。不应该弃用列表。

编辑除此之外,C ++并不仅仅适用于“现代硬件”。它旨在用于更广泛的硬件。我是金融行业的程序员,我使用C ++,但其他领域,如嵌入式设备,可编程控制器,心肺机和无数其他领域同样重要。 C ++语言不应该仅根据某些域的需要和某些类别的硬件的性能而设计 。仅仅因为 I 可能不使用列表并不意味着它应该从语言中弃用。

答案 1 :(得分:8)

向量是否优于列表也取决于元素的类型。例如,对于int元素,向量确实非常快,因为大多数数据适合CPU高速缓存,SIMD指令可用于数据复制。因此,向量的O(n)复杂度没有太大影响。

但是更大的数据类型呢,复制不会转换为流操作,而是必须从所有地方获取数据?另外,那些没有大CPU缓存且可能还缺少SIMD指令的硬件呢? C ++不仅仅用于现代桌面和工作站机器。弃用std :: list是不可能的。

Stroustrup在该演示文稿中说的是,在为数据选择std :: list之前,您应该确保它是您的特定情况的正确选择。换句话说,基准和配置文件。它绝对不会说你应该总是选择std :: vector。

答案 2 :(得分:3)

不,尤其不是基于一个特定的图表。有些情况下列表的性能优于矢量。请参阅:http://www.baptiste-wicht.com/2012/12/cpp-benchmark-vector-list-deque/

正如其他人所提到的那样,这忽视了非绩效差异。

Bjarne在那次谈话中的观点并不是你不应该使用列表。人们对列表的性能做了太多假设,而这往往是错误的。他只是证明了向量应该始终是你的默认首选容器类型的立场,除非你真的发现需要列表的性能或其他语义特征。

答案 3 :(得分:-1)

当然不是。 std :: list是一个不同的数据结构。比较不同的数据结构是其性质,优点或缺点的良好指示。但每个数据结构都有其优势。