如何使用make_heap在c ++中创建最小堆

时间:2018-02-27 10:17:08

标签: c++ c++11 c++14 heap

如何使用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);
                                      ^

我真的不明白这意味着什么,我做错了什么?

1 个答案:

答案 0 :(得分:3)

myComp是类型名称,而std::make_heap是函数(模板),要调用它,您需要传递对象。所以创建一个这种类型的对象。

make_heap(Q.begin(), Q.end(), myComp{});

{}将初始化您传递的myComp对象。

当您阅读文档Compare是演绎者的推导类型时,请注意函数模板需要comp 函数参数,这是您的对象。