STL容器 - 矢量,列表和双端队列之间的区别

时间:2012-03-10 21:16:29

标签: c++ stl containers

如果我想在容器的开头推送元素,我应该使用deque而不是vector吗?什么时候应该使用列表?它的重点是什么?

2 个答案:

答案 0 :(得分:14)

如果您需要在序列的开头和结尾有效插入/删除并随机访问,请使用deque;如果您需要在任何地方有效插入,请牺牲随机访问权限时使用list。迭代器和对list元素的引用在容器的几乎任何变异下都非常稳定,而deque具有非常奇特的迭代器和引用失效规则(因此请仔细检查它们)。

此外,list是基于节点的容器,而deque使用大量连续内存,因此内存位置可能具有无法通过渐近复杂度估计捕获的性能影响。

deque几乎可以在任何地方替代vector,并且应该被视为"默认" C ++中的容器(由于其更灵活的内存要求);选择vector的唯一理由是,您必须保证序列的连续内存布局。

答案 1 :(得分:12)

dequevector提供随机访问权限,list仅提供线性访问权限。因此,如果您需要能够执行容器[i],则排除list。另一方面,您可以有效地在list中的任何位置插入和移除项目,并且vectordeque中间的操作速度很慢。

dequevector非常相似,基本上可以互换用于大多数用途。只有两个值得一提的差异。首先,vector只能在最后有效地添加新项目,而deque可以有效地在任一端添加项目。那你为什么要用vector呢?与deque不同,vector保证所有项目都存储在连续的内存位置,这样可以在某些情况下更快地迭代它们。