Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么堆在c++;作为算法而不是容器实现?_C++_Algorithm_Stl_Heap - Fatal编程技术网

C++ 为什么堆在c++;作为算法而不是容器实现?

C++ 为什么堆在c++;作为算法而不是容器实现?,c++,algorithm,stl,heap,C++,Algorithm,Stl,Heap,我想知道为什么堆概念被实现为算法(make_heap,pop_heap,push_heap,sort_heap)而不是容器。我特别感兴趣的是,有些人的解决方案还可以解释为什么set和map是容器而不是类似的算法集合(make\u-set-add\u-set-rm\u-set等)。嗯,堆并不是真正意义上的通用容器,与集合或映射不同。通常,您使用堆来实现其他一些抽象数据类型。(最明显的是优先级队列。)我怀疑这就是不同处理的原因。一个明显的原因是您可以将元素作为堆排列在另一个容器中。 因此,您可以对向

我想知道为什么堆概念被实现为算法(
make_heap
pop_heap
push_heap
sort_heap
)而不是容器。我特别感兴趣的是,有些人的解决方案还可以解释为什么
set
map
是容器而不是类似的算法集合(make\u-set-add\u-set-rm\u-set等)。

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

一个明显的原因是您可以将元素作为堆排列在另一个容器中。

因此,您可以对
向量
deque
甚至C数组调用
make_heap()

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


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

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

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


*尤其是二进制堆。其他形式的堆(二项式、斐波那契等)则不是。STL确实以std::priority\u队列的形式提供堆。make_heap等函数之所以存在,是因为它们的用途超出了数据结构本身的范围(例如排序),并允许在自定义结构(如“保持前10名”容器的堆栈数组)之上构建堆

通过类比,您可以使用std::set来存储已排序的列表,也可以使用std::sort对带有std::nextant\u find的向量进行排序;排序是一种更通用的方法,对底层数据结构几乎不做任何假设


(注意,std::priority\u队列实现实际上并不提供自己的存储;默认情况下,它创建一个std::vector作为其备份存储。)

对于记录,有一个基于堆的容器:
priority\u队列
。为什么不呢?对于堆,可以使用任意随机访问序列。不要强迫你使用特殊的容器是好的。人们应该试着把事情分开。不,使用序列时,集合和贴图并不能很好地工作。使用实际的二叉树更容易。因为有些人似乎感到困惑:kts指的是数据结构[,而不是免费存储。@sellibitze:因为您可以同样轻松地将底层容器作为模板参数,例如
heap h;
@reverse:我同意,它不是唯一的容器适配器。