【发布时间】:2017-01-12 10:43:07
【问题描述】:
我一直认为在 C++ 标准模板库 (STL) 中,双端队列 (deque) 是具有循环边界条件的大小可变数组(类似于向量),这意味着有一个头指针 i 和一个尾指针j 都指向数组a[0..L-1] 的某个位置。 push_front 是i--,push_back 是j++,pop_front 是i++,pop_back 是j--。当指针i 或j 到达L 或-1 时,它会重新出现在数组的另一端(分别为0 和L-1)。如果数组大小用尽(插入新元素后的指针i==j),则将原始大小翻倍的更大空间重新分配给a[],并像在向量中一样复制数据。考虑到循环边界条件,还有O(1) 时间随机访问。但是有人告诉我,在 STL 双端队列内部实际上有一个指针数组指向许多固定长度的数组段。它比圆形向量复杂得多。不使用简单的循环向量来实现双端队列的功能有什么好处?随机访问会变慢吗?
【问题讨论】:
-
好处是擦除项目很快。您不必重新分配整个内存块并将所有剩余的项目从旧的复制到新的。
-
@VioletGiraffe:你也永远不必为他所说的结构重新分配擦除。从前面或后面移除将是 O(1)(头部或尾部索引的破坏和增量或减量)。从中间移除将是 O(N),但考虑到
deque是双端队列的缩写,这似乎不会违背容器的目的。 -
deque不是一个循环容器,它就像一个向量链表。有开始也有结束 -
FWIW,我有你描述的容器,我从来没有想用
std::deque代替。 -
@BenjaminLindley:您的容器在删除项目时不会释放其内存,这可能是不可取的。