结构体与pair的应用

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 和 二维数组的不同:

  1. first 和 second 可以是不同类型的元素,二维数组则要求类型必须全部一致;
  2. 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值