修改 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<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
类对象(二进制函数)。
希望对您有所帮助!
【讨论】:
以上是关于修改 C++ 算法 STL 中的 make_heap 以作为最小堆工作的主要内容,如果未能解决你的问题,请参考以下文章