STL 按多个参数C++排序

STL sort by multiple parameters C++

本文关键字:C++ 排序 参数 STL      更新时间:2023-10-16

我有一个包含对象 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 私有成员

总的来说,我有一个学生列表: std::list<Studenti> listaStud_ = {stud1, stud2, stud3, stud4, stud5};

函数调用: std::sort(listaStud_.begin(), listaStud_.end(), mediaDescrescator);

我的错误是:mediaDescrescator 没有在这个范围内声明。

我已经看到了有关此类排序的其他主题,并且它们像我的一样声明,我甚至尝试使用矢量类型而不是列表。 调用 mediaDescrescator 时不带 (),因为它必须作为函数指针或函数对象传递。

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

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

  1. std::tie返回引用的std::tuple

  2. std::tuple定义了执行正确字典顺序比较的比较运算符。

因此,您需要做的就是将Studenti变成带有tietuple - 然后比较元组。

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_); }
};

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

将函数声明更改为:

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

基本上在课外有。

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

首先,如果 mediaDescrescator() 是一个非静态成员函数,它只需要一个"other"参数,因为它可以处理this成员。

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

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

您也可以直接在 lambda 中结合 Richard Hodges 的答案实现 order 函数(在本例中为公共成员):

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

基于Johan的回答:std::sort不能用于std::list,请像我的代码片段一样使用std::list<>::sort()