为什么STD :: Deque子阵列尺寸固定



背景

std::deque使用子阵列存储其元素。它还有一本额外的书籍保持数据结构,以跟踪其子阵列。这样,与std::vector相比,std::deque可以从背面增长更快(O(1),与摊销的O(1)相比,前部的增长速度(O(1)与O(1)相比,与O(n)相比)。这是由于std::deque可以在任一端添加一个子阵列,只需要修改其书籍结构。


问题

我不明白的是为什么子阵列的尺寸固定了,如这里所述:

典型的实现使用一系列单独分配的固定大小数组

没有修复大小的子阵列的优势。例如,由于子阵列的大小固定,因此中间的任何插入都必须是o(n)复杂性,其中n是最接近的元素的元素数。但是,如果子阵列可以自由生长,则中间插入将是o(k),其中k是子阵列中元素的数量,尤其是在std::deque有很多子阵列的情况下。从中间的删除也是一样的。

是因为std::deque想要保持其子阵列平衡吗?如果子阵列变得太大/小,可以通过使子阵列分开或合并来轻易缓解这种情况。复杂性仅为o(k),其中k是最大的子阵列的大小。(或最小的子阵列的组合尺寸和较小的邻居)

是因为固定尺寸的子阵列会更快地随机迭代吗?例如,如果您想要第n个元素,则必须仔细阅读保留数据结构的书籍,并添加所有以前的子阵列的大小,使其复杂性o(k),其中k是本书的大小保留的大小数据结构。但这也不是一件大事,因为std::deque被广告成为一个双重链接的列表,无论如何还是更好的缓存。


编辑: std::deque只是链接列表实现和数组实现之间的中间人。我猜我的问题已经失去了原始含义,只是建议它的行为比向量

更像链接列表。

我不明白的是为什么子阵列固定了尺寸

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


但这不是一件大事

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

由于 std::deque被广告为双重链接列表...

它不是这样的。

最新更新