C++ deque实现选项

C++ deque实现选项,c++,deque,C++,Deque,我需要构建自己的deque,因为我编程的环境中没有这样的东西。我发现自己在如何实施这一计划的两个选择之间左右为难: 我可以管理指向保存数据的数组的指针的可增长数组。问题是,如何确定每个辅助阵列的大小 我可以有一个周期性增长的大缓冲区,并在其上构建一个循环队列。在达到一定规模后,这似乎很糟糕,因为大型分配变得更难有效完成 有什么想法吗?对于第一个选项,您可以在分配数组时将每个数组的大小从之前的数组增加一倍,可能会达到由您了解的应用程序或内存限制决定的某个上限 第二次你似乎已经明白了 为什么不只

我需要构建自己的deque,因为我编程的环境中没有这样的东西。我发现自己在如何实施这一计划的两个选择之间左右为难:

  • 我可以管理指向保存数据的数组的指针的可增长数组。问题是,如何确定每个辅助阵列的大小
  • 我可以有一个周期性增长的大缓冲区,并在其上构建一个循环队列。在达到一定规模后,这似乎很糟糕,因为大型分配变得更难有效完成

有什么想法吗?

对于第一个选项,您可以在分配数组时将每个数组的大小从之前的数组增加一倍,可能会达到由您了解的应用程序或内存限制决定的某个上限

第二次你似乎已经明白了


为什么不只是一个简单的双链接列表?您需要快速随机访问吗?

我将结合您的两个选项—多个较小的缓冲区,并使每个“端点”指向另一个,基本上成为一个较大的圆形阵列。这样,您就不需要经常分配缓冲区。至于辅助缓冲区的大小,我认为Collin的建议是一个很好的建议-随动增加大小。

另一种方法是有向量列表(固定大小)。列表作为第一个DS的好处是,您可以在头部和尾部以及两者之间添加元素。使用固定大小的向量的好处是,您可以模拟二维数组,添加/删除行的时间为常数。现在假设你想在头上加一个。您应该在head(const time)的列表中添加一个节点,然后在固定大小向量的最后添加条目。因此,当出列已经有数据时,请考虑头部的任何条目,您将在第一行的最后一列插入数据。如果行中有可用空间,则在头的任何进一步插入都将发生在第一行的最后一个未填充的第二列。另一方面重复同样的步骤。
正常插入通常发生在列表向量的末尾,插入从向量的开头开始

只需实现双链接列表…在C++中,当引用一个DEQE时,除了一般的需求之外,还需要假设随机访问是正确的,这得益于原始设计者选择的命名方案。IIRC大多数std容器也是这样做的。双链接列表在指针上浪费了大量内存。对于我的结构,使用循环缓冲区可以让我存储两倍的元素。那么您的第一个选择可能是理想的。在尝试扩展列表时,不会产生任何复制开销(内存和时间),如果需要,还可以轻松地缩小列表。