【问题标题】:What is the reasoning for a deque to have a subscript operator?双端队列具有下标运算符的原因是什么?
【发布时间】:2018-12-05 19:27:13
【问题描述】:

我今天和一位朋友交谈,他提出了 deque 元素能够被下标运算符访问,而其他“相似”的 DS(如队列和堆栈)却不能访问,这是多么奇怪。毕竟,deque 不只是意味着双端队列吗?可以随机访问双端队列的事实不会破坏双端队列数据结构的完整性吗?

另外,从性能的角度来看,除非您实际使用双端队列方法(前后端函数系列),否则不要只使用下标运算符将更少的东西带到表中?我知道双端队列背后的实现将它分成块/块,并且通常需要两个操作才能实际随机访问一个元素,而向量保证在连续的内存中。

谢谢!

【问题讨论】:

  • 您也可以将向量用作队列。它只是表现得像废话。 =P

标签: c++ vector stl deque


【解决方案1】:

另外,从性能的角度来看,除非您实际使用双端队列方法(前后端函数系列),否则不要只使用下标运算符将更少的东西带到表中?我知道双端队列背后的实现将它分成块/块,并且通常需要两次操作才能实际随机访问一个元素,而向量保证在连续的内存中。

deque 相比vector 还有另一个优势。如果连续内存很大,则可能会耗尽向量的内存,超过操作系统可以分配的内存。因为双端队列是分页内存,所以一个好的实现可以降低对操作系统的要求,因为内存要求是不连续的。

【讨论】:

    【解决方案2】:

    deque 可以被随机访问的事实不会破坏 deque 数据结构的完整性吗?

    没有。你只是挂在它的名字上。我们确实对“队列”有一个明确的定义,所以这可能是一个不好的词选择,但是数据结构不是由它的名称来定义的。

    日期结构是具有一组特定关联操作的数据 (duh)。标准库使用下标运算符定义 deque。这就是数据结构。非常注意确保操作的各种要求不冲突,因此deque 作为数据结构的完整性得到了很好的维护。

    【讨论】:

    • 换句话说,这里deque只是一个在前面快速插入/删除的向量的名称。
    • @bipll:除了它与向量不太相似。首先,deque 不像vector 那样分配连续的内存块。
    • bipll: deque 不能实现为向量。当达到容量时,将不时重新分配vector的底层内存。然而在 C++ 标准中,如果通过 push_front/push_back ONLY 插入元素,则对双端队列中间元素的引用始终有效。如果 deque 是指向元素页面的指针数组,则可以满足这一点的唯一方法。可以重新分配数组并在前后添加新页面,而不会干扰现有页面。
    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 2020-04-19
    • 2021-10-12
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多