如果我想在容器的开头推送元素,我应该使用deque而不是vector吗?我什么时候应该使用列表,它的重点是什么?
如果您需要在序列的开头和结尾有效插入/删除和随机访问,请使用deque
;使用list
如果你需要在任何地方有效插入,牺牲随机访问。对于list
元素的迭代器和引用在容器的几乎任何变异下都非常稳定,而deque
具有非常奇特的迭代器和引用失效规则(因此请仔细检查它们)。
此外,list
是一个基于节点的容器,而deque
使用大块的连续内存,因此内存局部性可能具有无法通过渐近复杂性估计捕获的性能影响。
deque
可以作为几乎所有地方的vector
的替代品,并且应该被认为是C ++中的“默认”容器(由于其更灵活的内存要求);更喜欢vector
的唯一理由是你必须有一个保证序列的连续内存布局。
deque
和vector
提供随机访问,list
仅提供线性访问。因此,如果你需要能够做容器[i],那就排除了list
。另一方面,您可以有效地在list
中的任何位置插入和移除项目,并且在vector
和deque
中间的操作很慢。
deque
和vector
非常相似,基本上可以互换用于大多数用途。只有两个值得一提的差异。首先,vector
只能在最后有效地添加新项目,而deque
可以有效地在任一端添加项目。那你为什么要用vector
呢?与deque
不同,vector
保证所有项目都将存储在连续的内存位置,这使得在某些情况下更快地迭代它们。