min_element () внутри класса шаблона - PullRequest
2 голосов
/ 29 апреля 2011

Я пытаюсь создать самодельную мини-кучу с шаблоном класса, чтобы я мог работать на 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 ]

3 голосов
/ 29 апреля 2011
Третий аргумент

std::min_element является либо объектом функтора, либо указателем функции на компаратор.Функция компаратора должна быть свободной функцией ;вы пытаетесь присвоить ей не-static функцию-член .

Поскольку у compare_node нет причины быть функцией-членом, вы также можете сделать еевместо этого используется свободная функция.

Сказав это, ваш compare_node эквивалентен реализации компаратора по умолчанию для std::min_element, так что вы также можете вообще его не использовать.

0 голосов
/ 29 апреля 2011

Как уже упоминалось, вы можете опустить аргумент компаратора и просто вызвать std::min_element(c.begin(), c.end());.

Другой вариант - использовать std::set вместо вектора.Набор сохраняет свои элементы упорядоченными, поэтому вы можете получить наименьший элемент, вызвав *theSet.begin();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...