比较器 及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;
}