【问题标题】:STL Containers - difference between vector, list and dequeSTL Containers - 向量、列表和双端队列之间的区别
【发布时间】:2012-03-27 20:38:23
【问题描述】:

如果我想在容器的开头也推送元素,我应该使用双端队列而不是向量吗?什么时候应该使用 list,它有什么意义?

【问题讨论】:

    标签: c++ stl containers


    【解决方案1】:

    如果您需要在序列的开头和结尾进行高效插入/删除以及随机访问,请使用deque;如果您需要在任何地方有效插入,请使用list,以牺牲随机访问为代价。 list 元素的迭代器和引用几乎在容器的任何突变下都​​非常稳定,而 deque 具有非常奇特的迭代器和引用失效规则(请仔细检查)。

    另外,list 是基于节点的容器,而deque 使用连续内存块,因此内存局部性可能会产生无法通过渐近复杂度估计捕获的性能影响。

    deque 几乎可以在任何地方替代vector,并且可能应该被认为是 C++ 中的“默认”容器(考虑到其更灵活的内存要求);首选vector 的唯一原因是当您必须保证序列的连续内存布局时。

    【讨论】:

    • 根据我的经验,vector 的性能几乎总是优于 deque
    • @DonReba:这取决于用例,而分析确实是唯一的答案。如果你想分配一个很大的范围,向量可能会很困难,而双端队列可以分配新的块而不移动旧的块。当然,这取决于你在做什么。
    • @KerrekSB 你能在这里提供一些分析数据吗?这在决定性能时将非常明显。
    • @Sisir:这不是一个很好的答案。虽然“双端队列”原则上是一个好主意,但有许多糟糕的实现使用太小的块大小,因此有效地变成了链表。所以你肯定需要比较和分析; std::vector 对于许多“典型”容器大小的插入,通常表现更好,而不是在末尾。
    【解决方案2】:

    dequevector 提供随机访问,list 仅提供线性访问。所以如果你需要能够做容器[i],那排除list。另一方面,您可以高效地在list 中的任何位置插入和删除项目,而vectordeque 中间的操作很慢。

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

    【讨论】:

    • 你能在这里提供一些分析数据吗?这在决定性能时会非常明显。
    猜你喜欢
    • 2014-03-30
    • 2016-06-04
    • 2020-07-13
    • 2015-08-11
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2021-11-07
    • 2015-05-01
    相关资源
    最近更新 更多