为什么 std::deque 子数组大小是固定的?

Why are std::deque subarray sizes fixed?

背景

std::deque 使用子数组来存储它的元素。它有一个额外的簿记数据结构来跟踪它的子数组。这样,与 std::vector 相比,std::deque 可以从后面更快地增长(O(1) 与摊销 O(1) 相比),并且在前面更快(O(1) 与 O (n)).这是因为std::deque可以只在两端添加一个子数组,只需要修改它的簿记数据结构。


问题

我不明白的是为什么子数组的大小按照解释的那样固定 here:

typical implementations use a sequence of individually allocated fixed-size arrays

没有固定大小的子数组有很多优点。例如,由于子数组的大小是固定的,因此中间的任何插入都必须是 O(n) 复杂度,其中 n 是最接近端的元素数。但是,如果子数组可以自由增长,插入中间的时间复杂度为 O(k),其中 k 是子数组中元素的数量,这会快得多,尤其是当 std::deque 有很多子数组时。从中间删除也是一样。

是不是因为std::deque想保持子数组平衡?如果子数组太长 large/small,则可以通过启用子数组拆分或合并来轻松缓解这种情况。复杂度仅为 O(k),其中 k 是最大子数组的大小。 (或最小子数组及其较小邻居的组合大小)

是否因为固定大小的子数组使得随机迭代更快?例如,如果您想要第 n 个元素,则必须遍历簿记数据结构并将所有先前子数组的大小相加,从而使复杂度为 O(k),其中 k 是簿记的大小 数据结构。但这也不是什么大问题,因为 std::deque 被宣传为双向链表,无论如何都具有更好的缓存。


编辑: std::deque 只是链表实现和数组实现之间的中间人。我想我的问题已经失去了原来的意义,只是暗示它应该表现得更像一个链表而不是一个向量

What I don't understand is why the subarrays have their sizes fixed

因为正如评论中指出的那样,这允许标准要求的恒定复杂度随机访问。


But this is not a huge deal

我不同意,大概标准委员会也不同意。

since std::deque is advertised to be a doubly linked list ...

它不是这样宣传的。