我想知道为什么堆概念被实现为算法(make_heap
,pop_heap
,push_heap
,sort_heap
)而不是容器。我特别感兴趣的是,某个人的解决方案也可以解释为什么set
和map
是容器而不是类似的算法集合(make_set add_set rm_set等)。
答案 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
,包括您自己编写的容器。但set
或map
不仅仅意味着安排数据。
换句话说,标准容器不仅仅是它的底层数据结构。
答案 3 :(得分:4)
堆几乎总是使用数组作为底层数据结构来实现。因此,可以将其视为一组在阵列数据结构上运行的算法。这是STL在实现堆时所采用的路径 - 它将适用于具有随机访问迭代器(标准数组,向量,双端队列等)的任何数据结构。
您还会注意到STL priority_queue需要一个容器(默认情况下是一个向量)。这本质上是您的堆容器 - 它在底层数据结构上实现了一个堆,并为所有典型的堆操作提供了一个包装器容器。
*特别是二进制堆。其他形式的堆(二项式,斐波那契等)不是。
答案 4 :(得分:1)
嗯,堆不是真正的通用容器,与集合或地图的意义相同。通常,您使用堆来实现其他一些抽象数据类型。 (最明显的是优先队列。)我怀疑这是不同处理的原因。