比较器 及sort函数C/C++语言调用
布尔类型(bool(1))
一:布尔类型
1.1 在说比较器前,先说说布尔类型(bool),因为比较器需要借助布尔类型来实现。
布尔类型的变量只有两个值:true 和 false,即非真即假,一般零为假,非零为真。bool类型也可直接转为int型,即false转为0,true转为1
bool yes = true;
bool no = flase;
int a,b;
a = yes; //a的值为1
b = no; //b的值为0
1.2 bool类型变量的用处
一般在判断真假时会使用bool类型,也可以使用bool来立flag。
如比较器的实现、深搜时对已搜索过的点的标记、立flag判断、调用sort函数实现降序等等。
1.3 为什么要用bool类型
肯定也会有人像我一样想,既然完全可以用返回“0”和“1”的整型来代替true和false,那么为什么不用int型变量表示而要用bool型变量?
1、C中有另一个惯例,函数返回0表示成功,返回非0表示错误。这样一来,如果两种风格的函数放到一起,
就不容易很快的判断出来了。如果是用int表示bool的函数能直接用bool来表示返回值,那么一眼就能分辨出来了。
2、bool是个独一的类型,是会参与到函数重载解析中去的,这是将bool独立出来更有意义的原因。
3、bool可以节省空间。在做算法题的时候,有时候,用bool就可以过了。但int就不一定。字长不一样。
二、布尔型函数
2.1 布尔型函数是指函数的返回类型为布尔型变量,即为 true 或者 false
bool cmp(int a,int b)
{
return a > b; //若a>b则return true反之则return false
}
三、比较器与sort函数
3.1 比较器就是借助bool型函数实现排序中的关系比较,这里主要借助sort函数说一下。
3.2 sort函数在algorithm头文件里(需声明using namespace std),是一个排序函数,sort函数有三个参数:
1:排序开始的第一个元素的地址。
2:排序结束的下一个元素的地址,通常写为开始的地址加要排序的长度。
3:比较器(此参数可省略,若省略,默认从小到大排序)
例:a数组有十个元素,从小到大排,则sort函数参数填为(a,a+10)
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b) //比较器(加上则为降序)
{
return a>b;
}
int main()
{
int a[5] = {56,4,89,67,1};
sort(a,a+5,cmp);
for(int i = 0;i < 5;i++)
{
printf("%d ",a[i]);
}
return 0;
}
再举个例子,蓝桥云的拼数问题

#include <bits/stdc++.h>
using namespace std;
bool miaowa(string a, string b)
{
return a + b > b + a;//注意这里的比较
}
int main()
{
// 请在此输入您的代码
int n;
cin >> n;
string num[20];
for (int i = 0; i < n; i++)
{
cin >> num[i];}
sort(num, num + n, miaowa);
for (int i = 0; i < n; i++)
{
cout << num[i];
}
return 0;
}
sort与结构体
# 生日
## 题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很
多,没有时间,所以请你帮她排序。
## 输入格式
输入共有 $n + 1$ 行,
第 $1$ 行为 OI 组总人数 $n$;
第 $2$ 行至第 $n+1$ 行分别是每人的姓名 $s$、出生年 $y$、月 $m$、日 $d$。
## 输出格式
输出共有 n 行,
即 n个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
## 样例 #1
### 样例输入 #1
```
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
```
### 样例输出 #1
```
Luowen
Yangchu
Qiujingya
```
## 提示
数据保证,$1<n<100$,$1\leq |s|<20$。保证年月日实际存在,且年份 $\in [1960,2020]$。
#include <bits/stdc++.h>
using namespace std;
struct Student
{
string s;
int y;
int m;
int d;
int num;
};
bool cmp(Student a,Student b)
{
if(a.y<b.y)return 1;
if(a.y>b.y)return 0;
if(a.y==b.y)
{
if(a.m<b.m)return 1;
if(a.m>b.m)return 0;
if(a.m==b.m)
{
if(a.d<b.d)return 1;
if(a.d>b.d)return 0;
if(a.d==b.d)
{
if(a.num>b.num)return 1;
else return 0;
}
}
}
}
int main()
{
int n;
cin>>n;
struct Student student[101];
for(int i=0;i<n;i++){ cin>>student[i].s>>student[i].y>>student[i].m>>student[i].d,student[i].num=i;}
sort(student,student+n,cmp);
for(int i=0;i<n;i++){cout<<student[i].s<<endl;}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct Student
{
int yuwen, math, en, num, sum;
};
bool cmp(Student a, Student b)
{
if (a.sum > b.sum)
return 1;
else if (a.sum < b.sum)
return 0;
else
{
if (a.yuwen > b.yuwen)
return 1;
else if (a.yuwen < b.yuwen)
return 0;
else
{
if (a.num > b.num)
return 0;
else
return 1;
}
}
}
int main()
{
int n;
cin >> n;
struct Student a[305];
for (int i = 1; i <= n; i++)
{
cin >> a[i].yuwen >> a[i].math >> a[i].en, a[i].num = i;
a[i].sum = a[i].yuwen + a[i].math + a[i].en;
}
sort(a+1, a +1+ n, cmp);
for (int i = 1; i <= 5; i++)
{
cout << a[i].num << " " << a[i].sum << endl;
}
return 0;
}