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