模板类中的min_element()

时间:2011-04-28 23:14:54

标签: c++ templates visual-c++

我正在尝试使用模板类构建一个自制的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

2 个答案:

答案 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();来获取最小元素。