德克 - 为什么"储备"不存在?

Joh*_*ing 25 c++ stl

标准STL向量容器具有"保留"功能,用于保留未初始化的内存,以后可用于防止重新分配.

为什么另一个deque容器没有呢?

Dre*_*ann 14

增加a的大小std::vector可能是昂贵的.当vector超出其保留空间时,必须将向量的全部内容复制(或移动)到更大的保留空间.

这是特别是因为频繁的vector::reserve()调整大小可能是昂贵的deque存在的.

相反,a std::vector总是可以添加更多内存而无需重新定位现有元素.

  • @CatPlusPlus在实践中,我注意到它确实无关紧要.:) (28认同)
  • 给后来读者的最新评论:如果预先知道最大大小,动态内存分配是不需要的,并且我们仍然需要双端队列(或队列)语义,那么*环形缓冲区*是选择的数据结构。不幸的是没有STL容器,所以需要自己实现...... (3认同)
  • 尽管如此,调整大小在某些应用程序中确实很有用。我们有一个实时机器人控制循环,我们不允许在其中使用内存分配。我们可以使用向量,因为我们可以在构造函数中获得所有内存分配。能够在那里使用双端队列会很好,我们知道元素的数量总是小于限制。 (2认同)

Ste*_*sop 7

对于vectorstring,保留空间通过确保不需要复制/移动元素来防止最后的插入(直到容量)使迭代器和对早期元素的引用无效.这种搬迁也可能是昂贵的.

使用dequelist,之前的引用永远不会因最后的插入而失效,并且元素不会移动,因此不会出现保留容量的需要.

您可能认为使用vectorstring保留空间也可以保证以后的插入不会抛出异常(除非构造函数抛出),因为不需要分配内存.您可能认为相同的保证对其他序列有用,因此deque::reserve可能会有用.其实也有没有这样的保证vectorstring,虽然在大多数(所有?)实现这是真的.所以这不是预期的目的reserve.


Ser*_*lis 5

引用自C++参考

与 std::vector 不同,双端队列的元素不是连续存储的:典型的实现使用一系列单独分配的固定大小数组。
双端队列的存储会根据需要自动扩展和收缩。双端队列的扩展比 std::vector 的扩展便宜,因为它不涉及将现有元素复制到新的内存位置。

Deque 可以在任何需要的地方分配新内存并指向它,这与需要连续内存块来保存所有元素的向量不同。

  • 内容错误,无论如何也无法更新。cppreference.com 是一个为此目的积极维护的 wiki。 (10认同)
  • cplusplus dot com 仅供参考,您不应该使用它、链接到它或以任何其他方式承认它的存在 (8认同)