std::d eque 什么时候需要重新分配

When does std::deque need reallocation?

本文关键字:新分配 分配 eque 什么时候 std      更新时间:2023-10-16

我所知,std::deque将其元素存储在块块中(尽管它依赖于实现,但这是我在大多数源代码中读到的(,而不是在大多数情况下使用单个内存块的std::vector

因此,std::vector在插入过程中遇到重新分配是相当合理的。但是,我无法将任何需要重新分配std::deque的情况联系起来,因为当电流被炸毁时,它只是以新的内存块重新开始。

任何人都可以为我提供一个案例,即由于对其执行某些操作而导致std::deque需要重新分配?

谁能为我提供 std::d eque 需要重新分配的情况,因为 对其执行某些操作的结果。

在典型情况下,永远不会。虽然未指定deque的精确实现细节,但保留迭代器/指针/引用失效*和算法要求对于任何需要将现有内存块重新分配给更大或更小的内存块的场景来说,都会发现实际用途不佳。

[特别关注指针/引用失效,因为这告诉我们更多关于内存中必须发生的事情。迭代器可以做出一些例外,将其有效性与deque ]的内存表示分离。

试着设身处地为实施者着想。你如何实现像push_frontpush_back和扩展resize这样的功能,如果你曾经试图重新分配内存块,就不会使任何现有的指向deque的指针失效?

同样,如果您曾经想将

现有内存块重新分配给更小的尺寸,请保留对pop_frontpop_back以及缩小resize的类似要求(仅使指向已删除元素的指针无效(?

陷阱部分,以及您可能会发现重新分配的最遥远可能性的一个地方,是插入到deque的中间。这是指向deque的所有指针都可以失效的地方,并且可以重新分配deque's内容(可能,不一定实用(。只有在这种特殊情况下,作为deque实现者,我们才能使指向仍然存在的元素的指针失效,我们甚至可以自由地重新分配任何现有的内存块。但这不太可能发生,因为高效的insert实现通常只想洗牌和移动元素,而不是实际重新分配它们所在的内存块。

所有这些要求结合在一起,将实现限制在 Sutter 描述的类型上,即使他在那里有点草率并掩盖了理论部分。这有点像 C++03 代码通常理所当然地认为std::vector总是连续的,即使它是未指定的,因为std::vector的算法和迭代器要求使得连续表示几乎是唯一实际的选择。

因此,从理论上讲,有人可能会以某种方式在符合这些要求的同时偷偷在某个地方进行重新分配。但在实践中,这几乎是不可能的,而且绝对是不切实际的,所以你很难找到这样deque的实现。

我想到的一件事是,当您在 deque 上进行插入并且插入需要转到的页面已满时会发生什么? 插入函数上关于 deques 的 cplusplus.com 状态

If the insertion happens at the beginning or the end of the sequence, all iterators 
related to this container are invalidated, but pointers and references remain valid, 
referring to the same elements they were referring to before the call. If the 
insertion happens anywhere else in the deque, all iterators, pointers and references 
related to this container are invalidated.

真正引起我注意的部分是一切都无效,插入在中间,对我来说听起来底层数据结构正在发生一些事情。 我不确定这是否是重新分配,但它至少是移位复制插入。