Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::list是否应该弃用?_C++_Performance_Vector_Containers_Doubly Linked List - Fatal编程技术网

C++ std::list是否应该弃用?

C++ std::list是否应该弃用?,c++,performance,vector,containers,doubly-linked-list,C++,Performance,Vector,Containers,Doubly Linked List,根据Bjarne Stroustrup的研究,在std::list中插入和删除在现代硬件上效率极低: 用于插入和删除的大量向量节拍列表 如果这确实是真的,那么std::list还有哪些用例?那么它不应该被弃用吗?不,尤其是不应该基于一个特定的图形。在某些情况下,列表的性能优于向量。见: 正如其他人提到的,这忽略了非性能差异 比亚恩在演讲中的观点并不是说你们不应该使用列表。人们对list的性能做了太多的假设,结果往往是错误的。他只是证明了向量应该始终是默认的go-to容器类型的立场,除非您确实需

根据Bjarne Stroustrup的研究,在
std::list
中插入和删除在现代硬件上效率极低:

用于插入和删除的大量向量节拍列表


如果这确实是真的,那么
std::list
还有哪些用例?那么它不应该被弃用吗?

不,尤其是不应该基于一个特定的图形。在某些情况下,列表的性能优于向量。见:

正如其他人提到的,这忽略了非性能差异


比亚恩在演讲中的观点并不是说你们不应该使用列表。人们对list的性能做了太多的假设,结果往往是错误的。他只是证明了向量应该始终是默认的go-to容器类型的立场,除非您确实需要列表的性能或其他语义特征。

向量和列表解决了不同的问题。列表保证迭代器在插入和删除其他元素时不会失效。Vector不能保证这一点

这不全是性能问题。所以答案是否定的。列表不应该被弃用


<>强>编辑< /强>,C++不是设计为只在“现代硬件”上工作的,它的目的是在更宽的硬件范围内使用。我是金融行业的程序员,我用C++,但是其他领域,如嵌入式设备、可编程控制器、心肺机和无数其他人同样重要。C++语言不应该只考虑某些领域的需要和某些硬件的性能。仅仅因为我可能不使用列表,并不意味着应该从语言中弃用它

当然不是。列表是一种不同的数据结构。比较不同的数据结构可以很好地说明它的特性、优点或缺点。但每种数据结构都有其优势

向量是否优于列表还取决于元素的类型。例如,对于
int
elements,向量确实非常快,因为大多数数据都放在CPU缓存中,SIMD指令可用于数据复制。所以向量的O(n)复杂度没有太大影响

但是,对于较大的数据类型,复制不会转换为流操作,而是必须从各地获取数据,这又如何呢?另外,如果硬件没有大的CPU缓存,并且可能也缺少SIMD指令,那该怎么办?C++不仅仅用于现代桌面和工作站机器。不推荐std::list是不可能的


Stroustrup在该演示中所说的是,在为数据选择std::list之前,您应该确保它是适合您特定情况的正确选择。换句话说,基准和概要。它肯定没有说您应该始终选择std::vector。

不可失效的迭代器和引用,只要不删除该特定元素。您假设选择列表的唯一原因是为了插入性能。事实上,我认为存储容量是选择列表的主要原因,我也质疑这些结果。链接列表的插入和删除应该是
O(1)
,而向量的插入和删除应该是
O(n)
。@Walter该图实际上只是一个查看链接幻灯片的邀请。该图涉及两个操作的总和。查找要删除的元素,并将其删除。两种情况下的结果都是O(n)。移除是O(1)表示列表,O(n)表示向量,但向量的运算在列表的一半以下有一个常数因子。该测试是有效的,因为您通常必须在擦除元素之前找到要擦除的元素。但不幸的是,
list
确实受到了猛烈的抨击,因为standardese的人认为
size
必须是O(1)<代码>拼接以前是使用列表的最佳理由之一,现在它没有那么有用了,如果您需要它,最好自己制作一个容器:x@MatthieuM. C++11添加了
std::forward_list
来填补这个空缺。不是说
std::list
不会使迭代器失效。指向已删除节点的所有迭代器都将无效。实际上,这意味着您必须保留一个迭代器列表,就像在
std::vector
中一样<代码>标准::列表在几乎所有硬件上都很慢,不仅仅是现代硬件。您将很难找到一个用例和硬件的组合,其中
std::list
在内存或执行速度方面都优于
std::vector
。您提供的基准测试表明
std::list
只有在元素的大小较大时才有机会对抗
std::vector
。此时,最好在堆上分配元素,并将
std::unique\u ptr
存储在向量中。