sort函数
C++ STL 标准库中的 sort()
函数,本质就是一个模板函数,位于头文件<algorithm>
。
该函数专门用来对容器或普通数组中指定范围内的元素进行排序,默认升序排序,除此之外我们也可以选择标准库的其它排序规则,或者自定义排序规则。
- 函数参数模版
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
// 按照指定的 comp 排序规则,对 [first, last) 区域内的元素进行排序
// firt: 起始位置,左闭;
// last: 结束为止,右开;
// comp: 排序规则(比较器),可以省略,默认升序。
- 对数组升序排序:
#include<iostream>
#include<algorithm>
using namespace std;
main()
{
//sort函数第三个参数采用默认从小到大
int a[]={45,12,34,77,90,11,2,4,5,55};
sort(a, a + 10);
for(int i=0;i<10;i++) cout<<a[i]<<" ";
}
- 自定义排序规则:
#include <iostream>
#include <algorithm>
using namespace std;
bool ascend(int a, int b){
return a < b; // true时 a 在 b 前面,即升序
}
bool descend(int a, int b){
return a > b; // true时 a 在 b 前面,即降序
}
int main(){
int nums[] = {1,3,2,6,5,4,8,7};
sort(nums, nums + 8, ascend); // 升序
for(int i : nums) cout << i << " ";
cout << endl;
sort(nums, nums + 8, descend); // 降序
for(int i : nums) cout << i << " ";
return 0;
}
对于int, double等基本数据类型,标准库已有现成的排序规则,如
equal_to<Type>()、not_equal_to<Type>()、greater<Type>()、greater_equal<Type>()、less<Type>()、less_equal<Type>()等可以直接调用。
升序:sort(begin, end, less<data-type>());
降序:sort(begin, end, greater.<data-type>());
- 对vector进行排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> vec = {1,2,6,8,4,1,0,3,-1};
sort(vec.begin(), vec.end(), greater<int>()); // 升序
for(int i : vec) cout << i << " ";
cout << endl;
sort(vec.begin(), vec.end(), less<int>()); // 降序
for(int i : vec) cout << i << " ";
return 0;
}
- 需要传递其他变量的自定义排序写法(lambda函数):
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> vec = {1,2,6,8,4,1,0,3,-1};
int num = 1;
sort(vec.begin(), vec.end(), [=](int a, int b){
return abs(a-num) < abs(b-num);
}); // 到 num 的距离升序排序
for(int i : vec) cout << i << " "; // 1 1 2 0 3 -1 4 6 8
return 0;
}
- 结构体二级排序(自定义排序规则)
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct student
{
string name;
int math;
int eng;
};
bool comp(student a, student b){ // 先按数学成绩降序,再看英语成绩降序
if(a.math == b.math) return a.eng > b.eng;
return a.math > b.math;
}
int main(){
student students[] = {
{"aa", 80, 90}, // cc 100 60
{"bb", 90, 80}, // dd 90 100
{"cc", 100 ,60}, // bb 90 80
{"dd", 90, 100} // aa 80 90
};
sort(students, students + 4, comp);
for(auto stu : students){
cout << stu.name << " " << stu.math << " " << stu.eng << endl;
}
return 0;
}
- 结构体或类二级排序(内部重载
<
运算符)
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct student
{
string name;
int math;
int eng;
// 重载 < 运算符, 默认a < b成立时a在b前面
inline bool operator < (const student & anoter) const {
if(math == anoter.math) return eng > anoter.eng;
return math > anoter.math;
}
};
int main(){
student students[] = {
{"aa", 80, 90}, // cc 100 60
{"bb", 90, 80}, // dd 90 100
{"cc", 100 ,60}, // bb 90 80
{"dd", 90, 100} // aa 80 90
};
sort(students, students + 4); // 默认a < b成立时a在b前面,则重载 < 运算符
for(auto stu : students){
cout << stu.name << " " << stu.math << " " << stu.eng << endl;
}
return 0;
}
编译报错:invalid use of non-static member function
自定义sort时不正确使用非静态成员函数
关于类中重载sort函数的报错问题
类内sort自定义排序方法报错