C++ 使用stl维护最小堆的简单方法?

C++ 使用stl维护最小堆的简单方法?,c++,stl,heap,min-heap,C++,Stl,Heap,Min Heap,据我所知,对于用户定义的结构,这很容易。只需重载操作符您不需要重载操作符使用std::greater()作为比较器(所有make_heap,push_heap,pop_heap)。()很重要-std::greater是一个函子类而不是函数,因此您需要它的一个实例。答案很好,所以我只想添加一个小示例。假设您拥有以下数组: array<int, 10> A{5,2,8,3,4,1,9,12,0,7}; A变成max堆。另一方面,要拥有min堆,您需要添加一个比较器,但不需要实现一个比较

据我所知,对于用户定义的结构,这很容易。只需重载操作符您不需要重载
操作符使用
std::greater()
作为比较器(所有
make_heap
push_heap
pop_heap
)。
()
很重要-
std::greater
是一个函子类而不是函数,因此您需要它的一个实例。

答案很好,所以我只想添加一个小示例。假设您拥有以下数组:

array<int, 10> A{5,2,8,3,4,1,9,12,0,7};
A
变成
max堆
。另一方面,要拥有
min堆
,您需要添加一个比较器,但不需要实现一个比较器。而是按如下方式调用该方法:

make_heap(A.begin(), A.end(), greater<int>());
make_heap(A.begin(),A.end(),greater());
此调用将使数组成为
最小堆

PS:
\include
是使用
std::make_heap
所必需的。 同样的操作也适用于
向量


更大的问题是,他的比较器相当于
int
运算符>=
,它不是严格的弱排序比较器,因此是非法的。对不起,我没有仔细检查手册。是的,将comp传递给pop_heap或push_heap就可以了。然而,你是什么意思,我不应该使用外部比较器?如果这不是正确的方法,那么实现这一点的常见方法是什么?@user268451:如果您愿意,您可以使用外部比较器,但它必须实现严格的弱排序关系,因此不允许使用与
运算符>=
等价的逻辑,但允许使用与
运算符
等价的逻辑。有关更多信息,请参阅这篇优秀的文章,作者是现代C++的创始人之一:@user268451:您应该完全摆脱自定义比较器,改用
std::greater()
。@user268451:假设
a==b
。然后
a
a < b ? false : true; --> a >= b
b < a ? true : false; --> a > b
array<int, 10> A{5,2,8,3,4,1,9,12,0,7};
make_heap(A.begin(), A.end());
make_heap(A.begin(), A.end(), greater<int>());