【发布时间】:2013-01-25 10:19:06
【问题描述】:
据我了解,deque 背后的动机是提供一个具有高效push_front 的随机访问容器。
与 deque 相比,vector 的普遍优势包括更快的遍历和at(),但主要是它的 C 兼容性,因为它保证了连续的内存。双端队列没有,因为它是内存块的集合,每个内存块都包含多个值。
我很困惑。为什么不是像向量那样构建双端队列,而是在索引 0 之前保留内存以及在索引 size-1 之后保留的内存?这将保证连续的内存,启用高效的push_front,甚至在取消引用迭代器时避免额外的间接。
为了尽量减少插入过程中的移位,要移位的包含值将取决于插入点。如果在size()/2 之前的索引n 处插入,则将值向上移动到n 左。否则将n之后的值右移。
我错过了什么重要的事情,以至于 deque 是值数组的集合,而不是一个大数组?
【问题讨论】:
-
摊销成本,也许吧?快速
push_front不是deque的唯一要求 -
你会保留多少内存? 1KB、10KB、1M、1GB、24GB?无论你做什么,都会有人抱怨它要么太多要么不够......
-
Afaik 这就是 Qt 实现其 QList 的方式
-
@MatsPetersson 与
vector相同。我记得从 STL 家伙的 STL 视频内部,Microsoft 每次将其向量增长 1.5 倍。在前面也加上 0.5 的额外尺寸,你会得到一个不错的圆形增长因子 2。 -
@BenjaminLindley 您不仅是正确的,而且您在标准声音的顶部是正确的,我刚刚检查以了解更多信息。在 C++11 §23.3.3.4p1 中,“在双端队列中间的插入会使所有迭代器和对双端队列元素的引用无效。在双端队列的任一端插入都会使双端队列的所有迭代器无效,但对双端队列元素引用的有效性没有影响” 所以你非常是对的。作为对社区的服务,我需要删除我之前的评论。 非常非常感谢您提供的示例和进一步研究的建议。