std :: list应该被弃用吗?

问题描述 投票:9回答:4

根据Bjarne Stroustrup来自他的slidesGoing Native 2012 keynote,在std::list中的插入和删除在现代硬件上非常低效:

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

如果确实如此,那么std::list会留下什么用例?那不应该被弃用吗?

c++ performance vector containers doubly-linked-list
4个回答
23
投票

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

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

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


8
投票

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

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

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


3
投票

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

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

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.