【发布时间】:2012-03-27 20:38:23
【问题描述】:
如果我想在容器的开头也推送元素,我应该使用双端队列而不是向量吗?什么时候应该使用 list,它有什么意义?
【问题讨论】:
标签: c++ stl containers
如果我想在容器的开头也推送元素,我应该使用双端队列而不是向量吗?什么时候应该使用 list,它有什么意义?
【问题讨论】:
标签: c++ stl containers
如果您需要在序列的开头和结尾进行高效插入/删除以及随机访问,请使用deque;如果您需要在任何地方有效插入,请使用list,以牺牲随机访问为代价。 list 元素的迭代器和引用几乎在容器的任何突变下都非常稳定,而 deque 具有非常奇特的迭代器和引用失效规则(请仔细检查)。
另外,list 是基于节点的容器,而deque 使用连续内存块,因此内存局部性可能会产生无法通过渐近复杂度估计捕获的性能影响。
deque 几乎可以在任何地方替代vector,并且可能应该被认为是 C++ 中的“默认”容器(考虑到其更灵活的内存要求);首选vector 的唯一原因是当您必须保证序列的连续内存布局时。
【讨论】:
vector 的性能几乎总是优于 deque。
std::vector 对于许多“典型”容器大小的插入,通常表现更好,而不是在末尾。
deque 和 vector 提供随机访问,list 仅提供线性访问。所以如果你需要能够做容器[i],那排除list。另一方面,您可以高效地在list 中的任何位置插入和删除项目,而vector 和deque 中间的操作很慢。
deque 和vector 非常相似,并且在大多数情况下基本上可以互换。只有两个不同之处值得一提。首先,vector 只能在末尾高效地添加新项目,而deque 可以高效地在任一端添加项目。那么你为什么要使用vector呢?与deque 不同,vector 保证所有项目都将存储在连续的内存位置,这使得在某些情况下迭代它们更快。
【讨论】: