利用sort对结构体进行排序
程序员文章站
2022-07-12 16:31:59
...
sort()是在std ::标准名词空间中
我定义了一个学生类型的结构体来演示排序排序对结构体排序的用法
具体用法看代码
第一种方法在外面写一个比较函数(全局函数)
#include<iostream>
#include<string>
#include<algorithm>//sort函数包含的头文件
using namespace std;
//定义一个学生类型的结构体
typedef struct student
{
string name; //学生姓名
int achievement; //学生成绩
} student;
//这是函数是sort函数的第三个参数
//如果希望升序排序,就是"<",降序排列就是">"号
//如果希望用其他的参数作为排序条件,只需要把相应的条件改一下(如果改成name),这样结构体就以name作为排序标准
bool comparison(student a,student b){
return a.achievement<b.achievement;
}
//用来显示学生信息的函数
void show(student *stu,int n)
{
for(int i = 0; i < n; i++)
{
cout<<"姓名:"<<stu[i].name<<'\t'<<"成绩:"<<stu[i].achievement<<endl;
}
}
int main()
{
student stu[] = { {"张三",99},{"李四",87},{"王二",100} ,{"麻子",60}};
cout<<"排序前:"<<endl;
show(stu,4);
sort(stu,stu+4,comparison);
cout<<"排序后:"<<endl;
show(stu,4);
return 0;
}
第二种重载排序的<运算符
#include<iostream>
#include<string>
#include<algorithm>//sort函数包含的头文件
using namespace std;
//定义一个学生类型的结构体
typedef struct student
{
string name; //学生姓名
int achievement; //学生成绩
bool operator <(const student &a)const//使用sort 重载<号
{
return(achievement > a.achievement);
}
} student;
//用来显示学生信息的函数
void show(student *stu,int n)
{
for(int i = 0; i < n; i++)
{
cout<<"姓名:"<<stu[i].name<<'\t'<<"成绩:"<<stu[i].achievement<<endl;
}
}
int main()
{
student stu[] = { {"张三",99},{"李四",87},{"王二",100} ,{"麻子",60}};
cout<<"排序前:"<<endl;
show(stu,4);
sort(stu,stu+4);//
cout<<"排序后:"<<endl;
show(stu,4);
return 0;
}
重载也可以写外面
bool operator<(const student & a, const student & b)
{
return a.achievement > b.achievement;
}
更加详细的用法
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
class MyClass
{
public:
int id;
MyClass() {}
MyClass(int i): id( i ) {}
bool operator < ( const MyClass &b ) const
{
return id < b.id;
}
bool operator > ( const MyClass &b ) const
{
return id > b.id;
}
};
bool compare( MyClass a, MyClass b )
{
return a.id < b.id;
}
int main()
{
//------------------------------------------------------------------//
//数组
cout<<"数组"<<endl;
MyClass arr[10];
srand(time(NULL));
for( int i = 0; i < 10; i++ )
arr[i].id = rand()%101;
cout<<"before sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<arr[i].id<<ends;
cout<<endl;
sort(arr,arr+10,less<MyClass>());
cout<<"after sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<arr[i].id<<ends;
cout<<endl;
//------------------------------------------------------------------//
//------------------------------------------------------------------//
//动态数组vector
cout<<"动态数组vector"<<endl;
vector<MyClass> list;
for( int i = 0; i < 10; i++ )
list.push_back( MyClass( rand()%101 ) );
cout<<"before sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<list[i].id<<ends;
cout<<endl;
sort(list.begin(),list.end(),greater<MyClass>());
cout<<"after sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<list[i].id<<ends;
cout<<endl;
//------------------------------------------------------------------//
//------------------------------------------------------------------//
//定义比较函数
cout<<"定义比较函数"<<endl;
vector<MyClass> list2;
for( int i = 0; i < 10; i++ )
list2.push_back( MyClass( rand()%101 ) );
cout<<"before sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<list2[i].id<<ends;
cout<<endl;
sort(list2.begin(),list2.end(),compare);
cout<<"after sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<list2[i].id<<ends;
cout<<endl;
//------------------------------------------------------------------//
//------------------------------------------------------------------//
//使得类本身就是可以比较的
cout<<"使得类本身就是可以比较的"<<endl;
vector<MyClass> list3;
for( int i = 0; i < 10; i++ )
list3.push_back( MyClass( rand()%101 ) );
cout<<"before sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<list3[i].id<<ends;
cout<<endl;
sort(list3.begin(),list3.end());
cout<<"after sort"<<endl;
for( int i = 0; i < 10; i++ )
cout<<list3[i].id<<ends;
cout<<endl;
//------------------------------------------------------------------//
return 0;
}
上一篇: golang对结构体排序,重写sort
下一篇: C++ STL算法