如何使用make_heap
<algorithm>
方法创建最小堆
从它所说的documentation,我们可以传递第三个参数比较comp ,这是一个
二进制函数,接受范围中的两个元素作为参数, 并返回一个可转换为bool的值。返回的值表示 是否作为第一个参数传递的元素被认为是更少 它定义的特定严格弱顺序中的第二个。该 函数不得修改其任何参数。这可以是一个 函数指针或函数对象。
所以我尝试传递一个函数对象,如下所示
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
struct myComp {
bool operator() (const pair<int, char>& lhs, const pair<int, char>& rhs) {
return lhs.first > rhs.first;
}
};
int main() {
vector< pair<int, char> > Q;
Q.push_back( pair<int, char>(10, 'c') );
Q.push_back( pair<int, char>(123, 'a') );
Q.push_back( pair<int, char>(2, 'd') );
Q.push_back( pair<int, char>(9, 'f') );
Q.push_back( pair<int, char>(81, 'b') );
Q.push_back( pair<int, char>(4, 'e') );
make_heap(Q.begin(), Q.end(), myComp);
pop_heap(Q.begin(), Q.end());
cout << Q.back().first << ", " << Q.back().second << endl;
Q.pop_back();
return 0;
}
我收到以下错误
jdoodle.cpp: In function 'int main()':
jdoodle.cpp:25:38: error: expected primary-expression before ')' token
make_heap(Q.begin(), Q.end(), myComp);
^
我真的不明白这意味着什么,我做错了什么?
答案 0 :(得分:3)
myComp
是类型名称,而std::make_heap
是函数(模板),要调用它,您需要传递对象。所以创建一个这种类型的对象。
make_heap(Q.begin(), Q.end(), myComp{});
{}
将初始化您传递的myComp
对象。
当您阅读文档Compare
是演绎者的推导类型时,请注意函数模板需要comp
函数参数,这是您的对象。