STL按多个参数排序C ++

时间:2017-11-07 13:39:55

标签: c++ sorting c++11 stl

我有一个列表,其中包含用多个参数定义的对象Studenti。 我想对这个学生名单进行排序,首先是他们的平均值,如果手段相同,我会按字母顺序排序。

在我的班级学生中我声明了这个头部功能: bool mediaDescrescator(const&, const&); 这是以这种方式实现的:

bool Studenti::mediaDescrescator(const Studenti& a, const Studenti& b)
{
    if(a.medie_ != b.medie_)
    {
        return (a.medie_ > b.medie_);
    }

    return (a.nume_ > b.nume_);
}

medie_是Studenti的双重私人会员 nume_是Studenti的std :: string私有成员

主要我有一个Studenti列表: std::list<Studenti> listaStud_ = {stud1, stud2, stud3, stud4, stud5};

功能调用: std::sort(listaStud_.begin(), listaStud_.end(), mediaDescrescator);

我的错误是:mediaDescrescator未在此范围内声明。

我已经看过关于这种排序的其他主题,并且它们被宣布为我的,我尝试使用矢量类型而不是列表。 mediaDescrescator被称为without(),因为它必须作为函数指针或函数对象传递。

5 个答案:

答案 0 :(得分:5)

mediaDescrescatorStudenti的成员函数。它是根据类的词法范围定义的。因此,您可以访问Studenti::mediaDescrescator,但不能访问mediaDescrescator。全局命名空间中没有名为mediaDescrescator的函数。

此外,为了避免您可能遇到的下一个错误,请确保它是static成员函数。毕竟,你不需要一个有效的实例来调用它。它无法访问this的任何成员变量。

答案 1 :(得分:5)

  1. std::tie会返回std::tuple个引用。

  2. std::tuple定义执行正确词典比较的比较运算符。

  3. 所以你需要做的就是将Studenti变成tuple tie - 然后比较元组。

    bool Studenti::mediaDescrescator(const Studenti& a, const Studenti& b)
    {
        return std::tie(a.medie_, a.nume_) > std::tie(b.medie_, b.nume_);
    }
    

    您可能会发现在您编写的类上提供名为as_tuple()的方法很有用:

    struct Studenti
    {
       // rest of class
    
       auto as_tuple() const { return std::tie(medie_, nume_); }
    };
    

答案 2 :(得分:2)

您的实施存在一些问题。第一个,也就是编译器抱怨的那个是mediaDescrescatorStudenti范围内定义,并且您尝试在全局范围内访问它,使用Studenti::mediaDescrescator来获取指针它。其次,mediaDescrescatorStudenti的正常成员函数,因此需要在对象上调用它。这可以是固定的,例如通过使其成为静态成员函数,或者通过使其获取一个参数并与当前对象进行比较。第三,std::sort函数不能应用于std::list,因为它需要随机访问迭代器,std::list只提供双向迭代器。

答案 3 :(得分:1)

将功能声明更改为:

bool mediaDescrescator(const Studenti& a, const Studenti& b)

基本上它在课外。

如果您不想公开会员,请为他们编写getter函数,并在排序中使用它们。

答案 4 :(得分:1)

首先,如果mediaDescrescator()是一个非静态成员函数,它只需要一个&#34;其他&#34;参数,因为它可以使this成员工作。

其次,lambdas很容易让算法与成员函数一起工作(未经测试):

listaStud_.sort([](const studenti& a, const studenti& b) { return a.mediaDescrescator(b); });

你也可以直接在lambda中实现订单功能,与Richard Hodges&#39;回答(在这种情况下与公众成员):

listaStud_.sort([](const studenti& a, const studenti& b) { return std::tie(a.medie_, a.nume_) > std::tie(b.medie_, b.nume_); });

根据约翰的答案:std::sort无法在std::list上使用,请使用std::list<>::sort()代替我的代码段。