根据Bjarne Stroustrup来自他的slides的Going Native 2012 keynote,在std::list
中的插入和删除在现代硬件上非常低效:
矢量节拍列表大量插入和删除
如果确实如此,那么std::list
会留下什么用例?那不应该被弃用吗?
矢量和列表解决不同的问题。 List提供了保证,当您插入和删除其他元素时,迭代器永远不会失效。矢量不能保证。
它不仅仅是性能。所以答案是否定的。不应该弃用列表。
编辑除此之外,C ++不仅仅适用于“现代硬件”。它旨在用于更广泛的硬件。我是金融行业的程序员,我使用C ++,但其他领域,如嵌入式设备,可编程控制器,心肺机和无数其他领域同样重要。 C ++语言不应仅仅考虑某些域的需要和某些类硬件的性能。仅仅因为我可能不使用列表并不意味着它应该从语言中弃用。
向量是否优于列表也取决于元素的类型。例如,对于int
元素,矢量确实非常快,因为大多数数据适合CPU高速缓存,SIMD指令可用于数据复制。因此,向量的O(n)复杂度没有太大影响。
但是更大的数据类型呢,其中复制不会转换为流操作,而是必须从所有地方获取数据?另外,那些没有大CPU缓存且可能还缺少SIMD指令的硬件呢? C ++不仅仅用于现代桌面和工作站机器。弃用std :: list是不可能的。
Stroustrup在该演示文稿中说的是,在为数据选择std :: list之前,应该确保它是适合您特定情况的正确选择。换句话说,基准和配置文件。它绝对不会说你应该总是选择std :: vector。
不,尤其不是基于一个特定的图表。有些情况下列表的性能优于矢量。见:http://www.baptiste-wicht.com/2012/12/cpp-benchmark-vector-list-deque/
正如其他人所提到的那样,这忽视了非绩效差异。
Bjarne在那次谈话中的观点并不是你不应该使用列表。人们对列表的性能做了太多假设,而这往往是错误的。他只是证明了向量应始终是您的默认首选容器类型的立场,除非您确实需要列表的性能或其他语义特征。
当然不是。 std :: list是一个不同的数据结构。比较不同的数据结构是其性质,优点或缺点的良好指示。但每个数据结构都有其优势。