std :: max_element寻找->运算符

我试图找到存储在向量中的最大学生分数。 这是我的代码。 SL是学生对象的向量。

class Student{
public:
    int returnScore(){return score;}
    private:
    int score;
};
class StudentList{
public:
    vector<Student>sl;
bool compare( Student& s1,Student &s2)
    {
        return (s1.returnScore()<s2.returnScore());
    }
    void highest_score()
    {
        auto max_score = max_element(sl.begin(),sl.end(),compare);
        if(max_score == sl.end()){}
            //cout<<"Container empty.\n";
        else{}
          //  cout<<*max_score;
    }
};
int main()
{

    StudentList l;
    l.highest_score();

}

编译器将我带到C ++官方库并给出了错误。

error: must use '.*' or '->*' to call pointer-to-member function in '((__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&,Student&)>*)this)->__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&,Student&)>::_M_comp (...)',e.g. '(... ->* ((__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&,Student&)>::_M_comp) (...)'|

panda__2001 回答:std :: max_element寻找->运算符

我的编译器告诉我compare必须是静态函数,而不是常规成员函数:

static bool compare( Student& s1,Student &s2)

然后全部编译正常。

,
        auto max_score = max_element(sl.begin(),sl.end(),compare);

您无法执行此操作,因为compare是一个方法,并且max_element将没有此方法所属的对象。换句话说,您不能只调用compare,因为您还需要为其调用对象。

您可以将比较变成静态方法:

static bool compare( Student& s1,Student &s2)
{
    return (s1.returnScore()<s2.returnScore());
}

这将起作用。

或者,您也可以包装通话以进行比较:

auto max_score = max_element(sl.begin(),[this](Student& s1,Student& s2) {return compare(s1,s2);});

但是对我来说,似乎没有很多代码,而不是将compare变成函数/静态方法。

,

如其他答案中所述,使类成员函数static可以完成这项工作。另一种方法是在Student类中定义operator<,例如

inline bool operator<(const Student& s2)
{
    return (this->returnScore()<s2.returnScore());
}

并调用std :: max_element(使用默认运算符

auto max_score = max_element(sl.begin(),sl.end());
本文链接:https://www.f2er.com/3091074.html

大家都在问