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

Posted

技术标签:

【中文标题】修改 C++ 算法 STL 中的 make_heap 以作为最小堆工作【英文标题】:Modify make_heap in C++ algorithm STL to work as a minimum heap 【发布时间】:2017-04-08 03:09:02 【问题描述】:

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

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

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

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

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

我不知道我做错了什么? 有什么帮助吗?

【问题讨论】:

您正在为第三个参数传递一个类型。它必须是满足比较器要求的类型的对象实例。在那件事的末尾放一些()。而void 则毫无意义。 std::less<int>() 后面少了一对括号 【参考方案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&lt;int, vector&lt;int&gt;, greater&lt;int&gt;()&gt; 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&lt;int&gt;()); 会给出编译错误。你需要一个Compare 类对象(二进制函数)。

希望对您有所帮助!

【讨论】:

以上是关于修改 C++ 算法 STL 中的 make_heap 以作为最小堆工作的主要内容,如果未能解决你的问题,请参考以下文章

C++中STL学习笔记——常见算法操作演示

c++提高编程 5 STL-常用算法

C++中STL常用算法

[C++ STL] 常用算法总结

C++ STL 常用算法总结

C++ STL 算法,如“comm”实用程序