C# STL deque是否实现为循环链表? < >我找不到在C++ STL中如何实现DEQE的内部结构。

C# STL deque是否实现为循环链表? < >我找不到在C++ STL中如何实现DEQE的内部结构。,c#,c++,stl,C#,C++,Stl,我在前面的某个地方读到过,在C中它是作为循环列表实现的。C++ STL也是这样吗?另外,你能解释一下为什么会这样吗 编辑:通过C++ STL,我是指用Visual Studio C++ 2010进行的STL图书馆,也是GCC C/P > < P> STL的一个图书馆,是一个规范,而不是实现。该规范不要求在行为如何遵从定义的接口时必须执行。 < P> C++标准要求DEQE具有恒定的随机查找时间。循环链表不符合要求。否。它的实现方式允许一些变化,但循环链表肯定不符合要求 在大多数实现中,包括VC+

我在前面的某个地方读到过,在C中它是作为循环列表实现的。C++ STL也是这样吗?另外,你能解释一下为什么会这样吗


编辑:通过C++ STL,我是指用Visual Studio C++ 2010进行的STL图书馆,也是GCC C/P > < P> STL的一个图书馆,是一个规范,而不是实现。该规范不要求在行为如何遵从定义的接口时必须执行。

< P> C++标准要求DEQE具有恒定的随机查找时间。循环链表不符合要求。

否。它的实现方式允许一些变化,但循环链表肯定不符合要求

在大多数实现中,包括VC++和gcc,它基本上是指向数据块的指针数组。添加数据时,它通常只将其添加到现有的数据块中。当现有块已满时,它会分配一个新块,将其添加到要插入的数组末尾,然后将数据添加到该数组中。当/如果基数组空间不足,它会分配一个新的数组并复制那里的指针。

必须提供一个deque的实现

对其元素的恒定时间随机访问 在末端插入和移除恒定时间 开始时的固定时间插入和删除 1排除任何类型的链表,包括循环列表

2和3排除了存储元素的简单内存块

注:现行标准'03确实规定了2和3的固定时间,而不是摊销固定时间,见23.2.1/1,但我认为这是一个疏忽。我不知道如何在固定的时间内完成这三项工作。如果只有1的固定时间,2和3的摊销固定时间,那就相当容易了

AFAIK MSVC deque使用指向元素页面的指针的环形缓冲区。将环形缓冲区视为具有偏移+环绕的数组向量。一个页面包含少量元素IIRC不超过8,这取决于sizeofelement。如果需要更多的空间,则环形缓冲区会像std::vector一样增长,这就是需要摊销的恒定时间而不是恒定时间的地方

我认为其他实现GCC。。。将非常相似


顺便说一句:标准中还有一个条款规定,如果没有指针索引,就不可能只使用一个大的元素环缓冲区。23.2.1.3/1表示,开头或结尾的插入不会使对deque中元素的引用无效。显然,如果包含元素本身的结构在超出保留空间时必须重新分配,那么这是不可能的。普通环形缓冲区需要这样做,因此无法使用。

Re.NET,您可能会将使用循环缓冲区实现的常规队列与deque混淆根据VC++deque头中类模板定义中的第一条注释,它是指向块的指针的//循环队列。在那之后,都是希腊语。我把OP解释为一个循环数组,而不是一个循环链表。循环缓冲区是连续的,但是数据可以从缓冲区的中间开始,并环绕到缓冲区的前面。然而,STD::DeGe也不能是一个循环数组。@霍华德,链表的名称是标题。规格足够严格,以禁止循环缓冲区。IIRC,C++标准实际上是在包含类型而不是时间的复杂性方面表达的。否则,调整std::vector的外部向量的大小可能是一个ON*N操作。但由于复杂性是以列表的形式计算的,而不是整数或毫秒,所以它仍然在运行。在这里调整环形缓冲区的大小不涉及deque元素。调整std::vector的大小将在+M上,其中M是所有列表中元素的总数。或者简单地说,如果我们假设复制一个元素的成本,在这种情况下,列表是常数。我为deque::push_back等指定恒定时间是没有意义的。在固定时间内不可能增加索引,只能在固定时间内摊销,所以复杂性规范应该这么说。否则,我们也可以说std::list中的随机访问是O1,因为它不涉及对元素的操作。对我来说没有意义。ON+M是不正确的,它实际上只是OmaxN,M,N=列表的数量,M=所有列表中的元素数量。不管怎样,这并不能使我的观点无效。