C++关于对复杂数据类型排序的⽐较器何必再说
知识点⼩结
对于排序问题,我们可以⾃⼰写基于不同原理的排序⽅法,如冒泡排序,快排等。但在实际应⽤中,我们不可能每次都⾃⼰写排序,这⾥我们可以C++在algorithm包中定义好的sort()函数进⾏排序。但是,不论我们是⾃⼰⼿写排序,还是使⽤已有的sort函数,在⾯对复杂的数据类型,⽐如⾃⼰定义的结构体时,我们就有必要⾃⼰定义⼀个⽐较器,否则⽆法进⾏排序。对于sort()函数来说,其默认是按升序排序,我们可以⾃定义⽐较器来改变它。代码如下。
#include <iostream>
#include <algorithm>
//需要引⼊algorithm头⽂件,因为sort()函数包含在这个头⽂件⾥
using namespace std;
struct student
{
string name;
int socre;
int id;
乔巴头像
};
bool stuid_cmp(student &st1, student &st2)
山楂的英文
{
return st1.id > st2.id;
}
int main()
{
student stlist[] = {
{"jack", 85, 1},
{"kalvin", 86, 3},
{"taffy", 78, 2}
};
突发事件
sort(stlist, stlist+3, stuid_cmp);
for(int i=0; i<3; i++)
cout << stlist[i].id <<" " << stlist[i].name
<<" " << stlist[i].socre << endl;
return 0;
}
幼儿园区角活动观察记录表运⾏结果如下所⽰:
以上是单独写了⼀个⽐较器的⽅法,这种⽅法对于sort这类可以接受⼀个bool类型的值作为排序标准的函数⽐较适⽤。但是在今后的使⽤过程中,我们还会遇到诸如将复杂数据类型放⼊堆等的数据结构中的情况。每次单独重写⽐较器不是那么直观,我们可以直接在结构体当中就定义⽐较顺序。这⾥就涉及到运算符的重载。需要对运算符进⾏重载的原因,是基本的运算符是不能够⽐较复杂的结构体的,重载后相当于告知运算符如何⽐较⾃定义的结构体。具体来看下⾯的代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct student
外部效度{
string name;
int score;
木瓜泡酒int id;
//重载<;号,使得<;号能够⽐较结构体,也可定义成反序
bool operator<(const student& st1)const
{
return score < st1.score;
}
};
int main()
{
student stlist[] = {
{"jack", 85, 1},
{"kalvin", 86, 3},
{"taffy", 78, 2}
};
//这⾥由于已经在结构体声明时就定义了如何⽐较⼤⼩,所以 //sort函数就不需要再传⼊第三个参数了
sort(stlist, stlist+3);
for(int i=0; i<3; i++)
cout << stlist[i].id <<" " << stlist[i].name
<<" " << stlist[i].score << endl;
return 0;
湖人队员名单
}