STL按多个参数C++排序

Wol*_*ian 2 c++ sorting stl c++11

我有一个列表,其中包含用多个参数定义的对象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_);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Sto*_*ica 5

mediaDescrescator是...的成员函数Studenti.它是根据类的词法范围定义的.所以你可以访问Studenti::mediaDescrescator,但不是mediaDescrescator.mediaDescrescator全局命名空间中没有命名的函数.

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


Ric*_*ges 5

  1. std::tie返回一个std::tuple引用.

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

因此,所有你需要做的是把Studentitupletie-然后比较的元组.

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

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

struct Studenti
{
   // rest of class

   auto as_tuple() const { return std::tie(medie_, nume_); }
};
Run Code Online (Sandbox Code Playgroud)