如何实现std :: deque的排序?

时间:2014-06-13 06:57:59

标签: c++ sorting vector stl deque

到目前为止,我已经了解了如何在引擎盖下实现std::deque,并发现它类似于指向n字节数组的指针数组,其中数据实际存储在其中。所以现在我有几个与deques相关的问题。

描述我目前对其结构的了解的图片:enter image description here

问题是:

  1. 当执行push_front操作且数据块0中没有可用空间时,会在堆上分配新的数据块,并将指向这个新分配的内存的指针插入到“Map”中像普通数组一样的数组 - 在O(number_of_blocks)时间,是吗?

  2. 如何对这头野兽进行排序?无法想象更好的事情然后将所有数据复制到数组中,对其进行排序,然后将其放回原处。但这种方法需要O(n)辅助内存......但是! std::sort提供了用于对std::vectorstd::deque进行排序的类似界面。如何实现不同数据结构的不同算法?使用模板专业化?如果是,为什么std::list无法使用std::sort进行排序? 或者,std::sort可能不关心此容器的内部结构,只使用迭代器和方法,它们在std::vectorstd::deque中都很相似(如operator[]size()等)?这个想法听起来很合理,并回答“为什么不能std::sort排序std::list?”变得明显。

  3. 如何选择数据块的大小?你会说“它依赖于实现”,但请详细说明解决方案背后的不同实现和动机。

  4. 需要澄清。 感谢。

1 个答案:

答案 0 :(得分:14)

回答你的第一个问题,是的,它几乎是如何运作的。可以注意到,这种方法可以扩展到多级分层结构。但实际的实现通常坚持两级结构,完全如图所示。

对于你的第二个问题,如果你正在考虑std::sort,那么std::sort在不了解实际容器的机制的情况下工作。如果适用于一系列随机访问迭代器。由于std::deque的迭代器是随机访问迭代器,std::sort可以应用于std::deque。人们实际上可以争辩说,随机访问这种数据结构的元素是相当有效的。它不像向量中的随机访问那样有效,但在std::sort的上下文中仍然有效。

您不能将std::sortstd::list一起使用,因为std::list的迭代器不是随机访问迭代器。如果您愿意,可以为std::list实现自己的简单(慢)版本的随机访问迭代器。您可以将std::sort应用于一系列此类迭代器,从而将std::liststd::sort进行排序。但由于显而易见的原因,这将是非常低效的。

如果std::deque随机访问迭代器的效率非常高。

我不准备回答第三个问题。事实上,根据一系列实验,我发现这些尺寸是根据经验选择的,我不会感到惊讶。而且,当然,可能没有"一个尺寸适合所有"溶液