修改C ++算法STL中的make_heap以作为最小堆使用

时间:2017-04-08 03:09:03

标签: c++ algorithm stl

我确信我犯的是一些非常愚蠢的错误,但我们无法指出它。 C ++的make_heap STL中的algorithm函数具有语法

void make_heap(v.begin(), v.end(),Compare comp ); 其中v被声明为int向量。 现在comp输入默认为<,但我想更改它,以便我可以使用它来制作最小和最大堆。看看其他对我来说有意义的例子是

void make_heap(v.begin(), v.end(),std::less<int> );

OR

void make_heap(v.begin(), v.end(),std::greater<int> );

但我继续收到编译器错误expected primary expression before ')' token

我无法弄清楚我做错了什么? 有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

()放在最后

void make_heap(v.begin(), v.end(), std::greater<int>());

原因

priority_queue签名 -

template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;

因此,它需要一个Compare类(不是Compare类对象)作为第三个参数。所以priority_queue<int, vector<int>, greater<int>()> Q;会产生编译错误,因为你需要传递一个Compare类(二元谓词)。正确的语法是 -

priority_queue<int, vector<int>, greater<int>> Q;

make_heap签名是 -

template <class RandomAccessIterator, class Compare>
void make_heap (RandomAccessIterator first, RandomAccessIterator last,
                Compare comp );

采用Compare类对象。所以make_heap(v.begin(), v.end(), std::greater<int>());会给出编译错误。你需要一个Compare类对象(二进制函数)。

希望它有所帮助!