为什么c ++中的堆被实现为算法而不是容器?

时间:2010-06-30 18:01:11

标签: c++ algorithm stl heap

我想知道为什么堆概念被实现为算法(make_heappop_heappush_heapsort_heap)而不是容器。我特别感兴趣的是,某个人的解决方案也可以解释为什么setmap是容器而不是类似的算法集合(make_set add_set rm_set等)。

5 个答案:

答案 0 :(得分:11)

STL确实以std :: priority_queue的形式提供堆。 make_heap等功能就在那里,因为它们在数据结构本身范围之外有用(例如排序),并且允许在自定义结构之上构建堆(比如“保持前10名”的堆栈数组)容器)。

通过类比,您可以使用std :: set来存储已排序的列表,或者您可以在带有std :: adjacent_find的向量上使用std :: sort; std :: sort是更通用的,并且对底层数据结构做了很少的假设。

(注意,std :: priority_queue实现实际上并没有提供它自己的存储;默认情况下它会创建一个std :: vector作为它的后备存储。)

答案 1 :(得分:5)

一个明显的原因是您可以将元素排列为内部另一个容器 因此,您可以在make_heap()vector甚至是C数组上致电deque

答案 2 :(得分:4)

堆是特定的数据结构。标准容器具有复杂性要求,但没有指定它们的实现方式。这是一个很好但很重要的区别。您可以在几个不同的容器上make_heap,包括您自己编写的容器。但setmap不仅仅意味着安排数据。

换句话说,标准容器不仅仅是它的底层数据结构。

答案 3 :(得分:4)

堆几乎总是使用数组作为底层数据结构来实现。因此,可以将其视为一组在阵列数据结构上运行的算法。这是STL在实现堆时所采用的路径 - 它将适用于具有随机访问迭代器(标准数组,向量,双端队列等)的任何数据结构。

您还会注意到STL priority_queue需要一个容器(默认情况下是一个向量)。这本质上是您的堆容器 - 它在底层数据结构上实现了一个堆,并为所有典型的堆操作提供了一个包装器容器。

*特别是二进制堆。其他形式的堆(二项式,斐波那契等)不是。

答案 4 :(得分:1)

嗯,堆不是真正的通用容器,与集合或地图的意义相同。通常,您使用堆来实现其他一些抽象数据类型。 (最明显的是优先队列。)我怀疑这是不同处理的原因。