使用stl维护最小堆的简单方法
easy way to maintain a min heap with stl?
对于用户定义的结构体,据我所知,这很容易。只需重载操作符
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool comp(const int& a, const int& b)
{
return a<b?false:true;
}
int main ()
{
int myints[] = {10,20,30,5,15};
vector<int> v(myints,myints+5);
vector<int>::iterator it;
make_heap(v.begin(), v.end(), comp);
cout << "initial min heap : " << v.front() << endl;
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout<<endl;
pop_heap (v.begin(),v.end());
v.pop_back();
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout<<endl;
}
的结果是:
initial min heap : 5
5 10 30 20 15
30 10 15 20
现在pop_heap, push_heap不会正确维护最小堆?有什么更简单的方法可以做到这一点吗?谢谢!
编辑:对不起,我没有仔细检查说明书。是的,将comp传递给pop_heap或push_heap应该可以达到这个目的。但是,你说我不应该使用外部比较器是什么意思?如果这不是正确的方法,那么常见的方法是什么?
使用std::greater<int>()
作为比较器(对所有make_heap
, push_heap
, pop_heap
)。()
很重要——std::greater<int>
是一个函子类而不是一个函数,所以你需要一个它的实例。
答案很好,所以我只想添加一个小示例。假设您有以下数组:
array<int, 10> A{5,2,8,3,4,1,9,12,0,7};
,你想创建一个min heap
。最快的方法是使用make_heap
算法。但是,这在默认情况下会创建一个max heap
。换句话说,如果你调用:
make_heap(A.begin(), A.end());
A
变为max heap
。另一方面,要拥有min heap
,您需要添加比较器,但不需要实现比较器。而是按如下方式调用该方法:
make_heap(A.begin(), A.end(), greater<int>());
这个调用将使你的数组为min heap
。
PS: #include <algorithm>
是使用std::make_heap
所必需的。同样的操作也适用于vector
。
HTH !
您不需要为int
重载operator <
(实际上您不能)。如果您使用外部比较器,您也应该将相同的Comparator comp
传递给pop_head
。
* Edit: *
正如ildjarn所指出的,比较运算符没有实现严格弱排序关系。
a < b ? false : true; --> a >= b
b < a ? true : false; --> a > b
相关文章:
- 一种在C++中读取TXT配置文件的简单方法
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 将时间戳打印到流的最简单方法
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++ 将静态方法转换为简单方法
- 将一系列数字映射到 CPP 中的值的简单方法
- 引用基类模板的成员变量的简单方法
- 学习数据结构和算法的简单方法
- boost::variant - 对变体应用算术的最简单方法
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 在C++中将算术类型转换为 std::array 的最简单方法<uint8_t>
- 使用新运算符C++创建多维数组的简单方法
- C++-将ASCII字符数组中可能的数值转换为字符的最简单方法
- OpenSSL模块化最大数据类型大小的简单方法
- 获取当前按键的简单方法
- 多个 if-else 测试的更简单方法
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?