背景
std::deque
使用子数组来存储其元素。它有一个额外的簿记数据结构,以跟踪其子阵列。这样,与std::vector
相比,std::deque
可以从后面增长得更快(O(1)与摊销的O(1)相比),前面的速度要快得多(O(1)与O相比(N))。这是因为std::deque
只能在两端添加一个子数组,只需要修改其簿记数据结构。
问题
我不明白为什么子阵列的大小按照here所解释的那样固定:
典型的实现使用一系列单独分配的固定大小的数组
没有固定大小的子阵列有很多优点。例如,由于子阵列的大小是固定的,因此中间的任何插入都必须是O(n)复杂度,其中n是最近端的元素数。但是,如果子阵列可以自由增长,则中间的插入将是O(k),其中k是子阵列中元素的数量,这要快得多,特别是如果std::deque
有很多子阵列。从中间删除也是一样的。
是因为std::deque
想要保持其子阵列平衡吗?如果子阵列太大/太小,则可以通过启用子阵列进行拆分或合并来轻松减轻这种情况。复杂性将只是O(k),其中k是最大子阵列的大小。 (或者最小子阵列与它的较小邻居的组合大小)
是否因为固定大小的子阵列使得随机迭代更快?例如,如果你想要第n个元素,你必须通过簿记数据结构并添加所有先前子阵列的大小,使得复杂度为O(k),其中k是簿记的大小
数据结构。但这不是一个大问题,因为std::deque
被宣传为双向链表,无论如何都有更好的缓存。
编辑: std::deque
只是链接列表实现和数组实现之间的中间人。我想我的问题已经失去了它的原始含义,并且只是建议它应该更像链接列表而不是矢量
答案 0 :(得分:5)
我不明白为什么子阵列的大小已经固定
因为这允许标准所要求的恒定复杂性随机访问,如评论中所指出的那样。
但这不是一个大问题
我不同意,大概是标准委员会也是如此。
因为
std::deque
被宣传为双重链接列表...
它没有被广告宣传。