C++ std::deque(双端队列)真的是随机访问和恒定时间插入吗?

C++ std::deque(双端队列)真的是随机访问和恒定时间插入吗?,c++,vector,linked-list,std,deque,C++,Vector,Linked List,Std,Deque,我不断从人们和文档中听到std::deque是像std::vector一样的随机访问,是像链表一样的固定时间插入和删除。此外,与向量不同,std::deque可以在恒定时间的开始和结束处插入元素。我不确定该标准是否指定了std::deque的特定实现,但它应该代表双端队列,而且最有可能的是该实现结合了与指针链接在一起的类似向量的分配缓冲区。一个关键区别是元素不像std::vector那样是连续的 考虑到它们不是连续的,当人们说它们像向量一样是随机访问时,我是否认为它们是“摊销”意义上的意思,而不

我不断从人们和文档中听到std::deque是像std::vector一样的随机访问,是像链表一样的固定时间插入和删除。此外,与向量不同,std::deque可以在恒定时间的开始和结束处插入元素。我不确定该标准是否指定了std::deque的特定实现,但它应该代表双端队列,而且最有可能的是该实现结合了与指针链接在一起的类似向量的分配缓冲区。一个关键区别是元素不像std::vector那样是连续的

考虑到它们不是连续的,当人们说它们像向量一样是随机访问时,我是否认为它们是“摊销”意义上的意思,而不是实际上的向量?这是因为一个向量只涉及一个偏移地址,保证每次真正的恒定时间访问,而双端队列必须计算所请求元素在序列中的距离,并计算沿着它必须经过多少链接缓冲区才能找到特定元素

同样,在链表中插入只涉及断开一个链接并设置另一个链接,而在双端队列中插入(这不是最后一个或第一个成员,必须至少将插入点之后的所有成员移动一个位置,至少移动该特定链接缓冲区的一个位置。因此,例如,如果一个链接缓冲区有10个成员,而您恰好在该特定缓冲区的开头插入,则它必须至少移动10个成员(更糟糕的是,如果它超出了缓冲区容量,必须重新分配)

我很想知道这一点,因为我想实现一个队列,在标准库中,std::queue是他们称之为容器适配器的东西,这意味着我们不知道它是什么容器类型,只要它按照队列的方式工作。我想它通常是std::deque或std::list的一种包装器基于先进先出(first-in-first-out)的简单功能,我几乎可以肯定,链表插入队列并从末尾弹出会更快。因此,我会尝试显式地选择它,而不是std::queue

另外,我知道链表对缓存的友好程度较低,但我们将链表与双端队列进行比较,而不是向量,据我所知,双端队列需要做大量的记录,以便知道在迭代时链表的长度以及它在哪个特定的缓冲区中

编辑:我刚刚找到另一个有趣问题的评论:

“我见过的C++实现使用了指向 固定大小的阵列。这有效地意味着将 推回并不是一个固定的时间,而是随着智能的增长 因子,你仍然可以得到固定的摊销时间,所以O(1)不是 这是错误的,实际上它比向量快,因为 交换单个指针而不是整个对象(以及更少的指针 比物体更重要)。–Matthieu M.2011年6月9日”


从:

它是随机访问,但常数时间插入和删除只用于序列的开始和结束,中间是O(n)。< /P>
访问一个项目是O(1),但效率不如O(1)对于一个向量,无论它的位置如何,甚至不管它有多少个项,都需要相同数量的计算来计算出一个项在一个数据块中的位置。将此与一个列表进行比较,在该列表中找到第n个项,你必须遍历前面的n-1个项

“std::queue是他们所谓的容器适配器,这意味着我们不知道它是什么容器类型“<代码> STD::队列所使用的基础容器可通过模板参数配置。默认情况下,它是代码> DeQue/代码>。“对于涉及频繁插入或删除除开始或结束位置以外的元素的操作,DEQUE的性能较差,迭代器和引用的一致性不如列表和前向列表。“事实证明,在末尾和开头插入的只是摊销常数,如果我链接的图表是真的,那么在开头插入的平均速度要比在结尾插入的慢。我发现一条评论(我把它放在我的问题中)说,在开头和结尾插入的只是摊销常数(当它不必增长时)。我想这是相同的向量,但不适用于始终保证时间恒定的链表。std::deque开头和结尾的插入和擦除始终是摊销常量,大多数时间它确实是恒定的,但有时它必须增长(并被复制)这就是“摊销”部分的由来。列表总是O(1)在一个特定的位置插入,但作为交换,遍历列表的效率较低。有趣的是,我在问题中链接了一个图表,因为如果很多人都说它只是一个向量向量,那么在开始插入平均比在结束时慢,因为v的元素每当创建新缓冲区时,保存向量的向量总是必须向前移动。好吧,想想向量的情况,它有大小和容量,任何未使用的容量总是在最后出现,deque也允许在开始时使用未使用的空间,它不是真正的向量向量(至少不是std::vector)就像一个向量,其中一个块是存储项的固定大小单位。块类似于:struct Block{T items[8];};deque知道“first”项的偏移量,知道它的大小以及分配了多少块。因此,deque不仅不连续,而且增长因子也比vecto小