STL 按多个参数C++排序
STL sort by multiple parameters C++
我有一个包含对象 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
时不带 (),因为它必须作为函数指针或函数对象传递。
mediaDescrescator
是Studenti
的成员函数。它是在类的词法范围内定义的。所以你可以访问Studenti::mediaDescrescator
,但不能mediaDescrescator
。全局命名空间中没有名为 mediaDescrescator
的函数。
此外,为了避免您可能遇到的下一个错误,请确保它是一个static
成员函数。毕竟,您不需要有效的实例来调用它。它不访问 this
的任何成员变量。
-
std::tie
返回引用的std::tuple
。 -
std::tuple
定义了执行正确字典顺序比较的比较运算符。
因此,您需要做的就是将Studenti
变成带有tie
的tuple
- 然后比较元组。
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
来获取指向它的指针。其次,mediaDescrescator
是Studenti
的正常成员函数,因此需要在对象上调用它。这可以修复,例如,通过使其成为静态成员函数,或者通过使其采用一个参数并与当前对象进行比较。第三,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()
。
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 试图在c++中对数字列表进行排序
- 如何在C++中对数组进行冒泡排序