根据Bjarne Stroustrup的slides来自Going Native 2012 keynote,std::list
中std::list
的插入和删除在现代硬件上非常低效:
矢量节拍列表大量插入和删除
如果确实如此,那么{{1}}会留下什么用例?那不应该被弃用吗?
答案 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是一个不同的数据结构。比较不同的数据结构是其性质,优点或缺点的良好指示。但每个数据结构都有其优势。