std :: deque(双端队列)真的是随机访问和恒定时间插入吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: deque(双端队列)真的是随机访问和恒定时间插入吗?相关的知识,希望对你有一定的参考价值。
我继续听取人们和文档的意见,std :: deque是一个随机访问,如std :: vector,并且像链接列表一样是常量时间插入和删除。另外,与向量不同,std :: deque可以在开始和结束时以恒定时间插入元素。我不确定标准是否指定了std :: deque的特定实现,但它应该代表双端队列,并且很可能实现结合了与指针链接在一起的类似矢量的分配缓冲区。一个关键的区别是元素不像std :: vector那样连续。
鉴于它们不是连续的,当人们说它们像矢量一样随机访问时,我认为它们是以“摊销”的意义而不是现实中的载体?这是因为向量只涉及一个偏移地址,保证每次都能进行真正的恒定时间访问,而双端队列必须计算所请求元素在序列中的距离,并计算沿着它的链接缓冲区数量。去找到那个特定的元素。
同样,链接列表中的插入仅涉及断开一个链接并设置另一个链接,而在双端队列中插入(不是最后一个或第一个成员,必须至少在插入点之后移动所有成员)至少为那个特定的链接缓冲区放置。例如,如果一个链接缓冲区有10个成员而你碰巧在该特定缓冲区的开头插入,那么它必须至少移动10个成员(如果它超过缓冲区则更糟糕)能力,不得不重新分配)。
我很想知道这个,因为我想实现一个队列,而在标准库中,std :: queue就是他们所谓的容器适配器,这意味着我们不知道它究竟是什么容器类型,只要它起作用队列的意图。我认为它通常是std :: deque或std :: list的一种包装器。鉴于我只对先入先出类型的东西的简单功能感兴趣,我几乎可以肯定链接列表在插入队列和弹出结束时会更快。所以我很想明确选择那个而不是std :: queue。
另外,我知道链接列表对迭代的缓存不太友好,但是我们比较的是链接列表而不是矢量而是双端队列,据我所知,它必须做大量的记录 - 用于了解迭代时它在多远和哪个特定缓冲区中的位置。
编辑:我刚刚发现了另一个感兴趣的问题的评论:
“我见过的C ++实现使用了指向固定大小数组的指针数组。这实际上意味着push_front和push_back实际上并不是常数,但是随着智能增长因素的推移,你仍然可以按常数分摊,所以O(1)并不是那么错误,并且在实践中它比矢量更快,因为你交换单个指针而不是整个对象(并且指针比指针少)。 - Matthieu M. Jun 9 '11“
以上是关于std :: deque(双端队列)真的是随机访问和恒定时间插入吗?的主要内容,如果未能解决你的问题,请参考以下文章
6-5-2:STL之stack和queue——双端队列deque
Java 数据结构及算法实战系列 013:Java队列07——双端队列Deque