我想知道为什么堆概念被实现为算法(make_heap
, pop_heap
, push_heap
, sort_heap
)而不是容器。我特别感兴趣的是,有人的解决方案是否能够解释为什么set
和map
是容器,而不是类似于算法集合(make_set add_set rm_set 等)。
STL提供了一个std::priority_queue形式的堆。make_heap等函数之所以存在,是因为它们在数据结构本身的领域之外也有用途(例如排序),并且允许在自定义结构上构建堆(例如“保留前10个”容器的堆栈数组)。
类比地,您可以使用std::set存储已排序的列表,或者使用带有std::adjacent_find的vector进行std::sort;std::sort更通用,并对底层数据结构做出了较少的假设。
(需要注意的是,std::priority_queue实现实际上并没有提供其自己的存储方式;默认情况下,它会创建一个std::vector作为其后备存储器。)
一个明显的原因是你可以将元素作为堆放置在另一个容器中。
所以你可以在vector
或者deque
甚至C数组上调用make_heap()
。
堆是一种特定的数据结构。标准容器有复杂度要求,但不指定它们如何实现。这是一个微妙但重要的区别。你可以在多个不同的容器上使用make_heap
,包括你自己编写的容器。但是,set
或map
意味着不仅仅是一种排列数据的方式。
换句话说,标准容器不仅仅是其底层数据结构。
嗯,堆并不像集合或映射那样是一种通用容器。通常情况下,您使用堆来实现其他抽象数据类型(最明显的是优先队列)。我认为这就是不同处理方式的原因。
priority_queue
。 - avakarheap<type, vector> h;
。 - Inverse