我正在尝试使用模板类构建一个自制的min-heap,这样我就可以在Dijkstra或Prim上工作了。但是find_min()函数不适用于std :: min_element()。任何线索将不胜感激。谢谢!
来自VC2010express的错误消息,简而言之,
错误C2780:'_ FwdIt std :: min_element(_FwdIt,_FwdIt)':需要2个参数 - 提供3个
以及以下代码:
#ifndef MIN_HEAP_H
#define MIN_HEAP_H//use (unsorted) vector and min() algorithm
#include <vector>
#include <algorithm>
#include <functional>
template <typename T>
class MinHeap{
std::vector<T> c;//container
typedef typename std::vector<T>::iterator iterator;
bool compare_node(const T& lhs,const T& rhs) const {return lhs<rhs;}//define compare function for nodes
public:
MinHeap():c(){}//default constructor
inline void insert(T node){c.push_back(node);}
iterator find_min(){
iterator min_node=std::min_element(c.begin(),c.end(),compare_node);//doesn't build
return min_node;
}
// deleteMin();
// deleteNode(node);
// decreaseKey(node);
};
#endif
答案 0 :(得分:3)
std::min_element
的第三个参数是一个仿函数对象,或一个指向比较器的函数指针。比较器功能必须是自由功能;你试图给它一个非static
成员函数。
由于compare_node
没有理由成为会员功能,所以你可以改为使用免费功能。
话虽如此,您的compare_node
相当于std::min_element
的默认比较器的实现,因此您根本不能使用它。
答案 1 :(得分:0)
如前所述,您可以省略比较器参数,只需调用std::min_element(c.begin(), c.end());
。
另一种选择是使用std::set
而不是向量。集合保持其元素有序,因此您可以通过调用*theSet.begin();
来获取最小元素。