关于对结构体中字符串的排序~~

本文介绍了一种对学生成绩进行非递增排序的方法,当分数相同时,根据学生姓名的字典序进行递增排序。讨论了在大量数据输入输出时,使用cin、cout可能导致的效率问题,并提出了使用scanf、printf及char数组替代string类型的解决方案。通过两个对比示例,详细解释了如何利用C++的sort函数和自定义比较函数实现这一需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如有这样一个要求,对学生的成绩非递增排序,分数相同的学生根据其名字以字典序递增排序。

一般我们会这样来处理?

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct Data
{
	string name;
	int score;
} stu[100];
bool cmp1(Data a,Data b)
{
	if(a.score!=b.score)
		return a.score>b.score;
	else
		return a.name<b.name;
}
...
sort(stu,stu+N,cmp1);
...

但是,string类型只能用cin,cout来输入输出,而当输入字符串数量较多时,cin,cout的使用可能会导致超时,需要使用scanf和printf进行输入输出,对应的只能使用char类型数组来存储字符串。

那么,我们的cmp()函数中就不能再使用return a. name < b. name,应变成如下形式:

#include<cstdio>
#include<cstring>   //提供strcmp()函数
#include<algorithm>
using namespace std;
struct Data
{
	char name[20];
	int score;
} stu[100];
bool cmp2(Data a,Data b)
{
	if(a.score!=b.score)
		return a.score>b.score;
	else
		return strcmp(a.name,b.name)<0;
}
...
sort(stu,stu+N,cmp2);
...

PS.

strcmp()函数

声明

int strcmp(const char *str1, const char *str2)

参数

  • str1 – 要进行比较的第一个字符串。
  • str2 – 要进行比较的第二个字符串。

返回值
该函数返回值如下:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str2 小于 str1。
  • 如果返回值 = 0,则表示 str1 等于 str2。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值