到目前为止,我已经了解了如何在引擎盖下实现std::deque
,并发现它类似于指向n字节数组的指针数组,其中数据实际存储在其中。所以现在我有几个与deques相关的问题。
描述我目前对其结构的了解的图片:
问题是:
当执行push_front
操作且数据块0中没有可用空间时,会在堆上分配新的数据块,并将指向这个新分配的内存的指针插入到“Map”中像普通数组一样的数组 - 在O(number_of_blocks)时间,是吗?
如何对这头野兽进行排序?无法想象更好的事情然后将所有数据复制到数组中,对其进行排序,然后将其放回原处。但这种方法需要O(n)辅助内存......但是! std::sort
提供了用于对std::vector
和std::deque
进行排序的类似界面。如何实现不同数据结构的不同算法?使用模板专业化?如果是,为什么std::list
无法使用std::sort
进行排序?
或者,std::sort
可能不关心此容器的内部结构,只使用迭代器和方法,它们在std::vector
和std::deque
中都很相似(如operator[]
, size()
等)?这个想法听起来很合理,并回答“为什么不能std::sort
排序std::list
?”变得明显。
如何选择数据块的大小?你会说“它依赖于实现”,但请详细说明解决方案背后的不同实现和动机。
需要澄清。 感谢。
答案 0 :(得分:14)
回答你的第一个问题,是的,它几乎是如何运作的。可以注意到,这种方法可以扩展到多级分层结构。但实际的实现通常坚持两级结构,完全如图所示。
对于你的第二个问题,如果你正在考虑std::sort
,那么std::sort
在不了解实际容器的机制的情况下工作。如果适用于一系列随机访问迭代器。由于std::deque
的迭代器是随机访问迭代器,std::sort
可以应用于std::deque
。人们实际上可以争辩说,随机访问这种数据结构的元素是相当有效的。它不像向量中的随机访问那样有效,但在std::sort
的上下文中仍然有效。
您不能将std::sort
与std::list
一起使用,因为std::list
的迭代器不是随机访问迭代器。如果您愿意,可以为std::list
实现自己的简单(慢)版本的随机访问迭代器。您可以将std::sort
应用于一系列此类迭代器,从而将std::list
与std::sort
进行排序。但由于显而易见的原因,这将是非常低效的。
如果std::deque
随机访问迭代器的效率非常高。
我不准备回答第三个问题。事实上,根据一系列实验,我发现这些尺寸是根据经验选择的,我不会感到惊讶。而且,当然,可能没有"一个尺寸适合所有"溶液