struct
在 C\C++ 中,有时我们需要自定义一些数据类型,例如,我们需要定义一个学生类型 Stu,每个学生类型中要包含语文、数学、英语的成绩,以及该生的姓名,这时,用任意的自有变量类型都是无法实现的,我们只有自己去定义,这样的类型就称为结构体。
定义学生类型的结构体可以写成:
struct Stu {//structure
char name[37];
int math, cn, en, sum;
};
Stu a, b, c;
这样就可以使用 Stu 类型定义新的变量了,例如上面的 a,b,c,就是 3 个 Stu 的变量。
结构体的成员变量
结构体中的各个变量称为结构体的成员变量,如 Stu 中的 name, math, cn, en, sum
。
我们可以通过使用 '.' 来引用结构体中的各个变量,实现对他们的赋值、输入、输出。
scanf("%s%d%d%d", a.name, &a.math, &a.cn, &a.en);
a.sum = a.math + a.cn + a.en;
printf("%s: %d %d %d %d\n", a.name, a.math, a.cn, a.en, a.sum);
结构体之间的比较
由于结构体是自定义的类型,因此,系统无法直接帮助我们进行变量之间的比较操作。如果执行 if (a < b)
,系统会报错
[Error] no match for 'operator<' (operand types are 'Stu' and 'Stu')。
这个时候,我们需要使用一个 C++ 独有的黑科技运算符重载来告诉系统,它们应该如何比较。
struct Stu {
char name[37];
int math, cn, en, sum;
//对于两个Stu变量 a 和 b
//当使用 a<b 时,a就会调用自己的operator<函数,b作为参数传进去
//一个返回值为 bool 的函数,
//const Stu &B表示该函数不允许修改B的值
//小括号后的const,表示该函数不允许修改结构体内的任何成员变量
bool operator< (const Stu &B) const {
//sort通常按从小到大排列,小的排在前面
//所以我们希望谁排在前面,就把相应的条件写在这里判断
return sum < b.sum;
}
};
c++中的应用
在 C++ 中,声明变量时,在变量名前加上 ‘&’ 符号,并在后面通过赋值运算符,将另一个变量赋值给该变量,此后,这两个变量就会被绑定到同一个地址空间的数据上,修改任何一个,都等同于修改另一个,即两个变量会同时变化。
我们通常在不需要修改变量值时,用这种引用的方式声明函数的形式参数。
#include <cstdio>
int main() {
int a = 5, &b = a;
b = 9;
printf("%d", a);//输出 9
return 0;
}
pair的用法
当我们要存的结构体只有两个变量时,我们也可以使用 C++ 中的 pair,顾名思义,pair 称为有序对或序偶,也就是说它可以同时存储两个变量,其中第一个变量名为 first,第二个变量名为 second。
乍一看,它可能和一个二维数组差不多,但是它们有两点不同:
pair 和 二维数组的不同:
- first 和 second 可以是不同类型的元素,二维数组则要求类型必须全部一致;
- pair 还被称之为“序偶”,亦即它默认是可以比较的。它以 first 作为第一关键字,second 为第二关键字。
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1007;
//first 为 int 类型;second 为 double 类型
pair<int, double> stu[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d%lf", &stu[i].first, &stu[i].second);
//先按 first 排序,first 相同,则按 second 排序
sort(stu+1, stu+n+1);
for (int i = 1; i <= n; ++i)
printf("%d: %.2f\n", stu[i].first, stu[i].second);
return 0;
}
输入数据 1
5
5 85.5
1 80
3 82
4 90
3 80
输出数据 1
1: 80.00
3: 80.00
3: 82.00
4: 90.00
5: 85.50