c++结构体排序方式(1条件,多条件)

 更新时间:2023年08月14日 10:34:25   作者:wo_jiushi_wo  
这篇文章主要介绍了c++结构体排序方式(1条件,多条件),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

c++结构体排序(1条件,多条件)

最近做题的时候总会遇到排序问题,同样一个问题用结构体排序和用数组做差的不仅仅是代码的长度,还有理解的难易程度,很明显,用结构体排序更简单易懂。

但结构体不能直接用algorithm头文件里的sort函数,需要我们自己补充一个函数。这里就给大家一一列举出来。

一个判断条件

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct cj
{
	int num;
	string name;
	int score;
};
bool cmp(cj a,cj b)
{
	return a.score>b.score;
}
int main()
{
	cj x[5];	//这里的5可以手动输入n代替
	for(int i=0;i<5;i++)
	 cin>>x[i].name>>x[i].score>>x[i].num;
	sort(x,x+5,cmp);
	cout<<'\n';
	for(int i=0;i<5;i++)
	cout<<x[i].name<<'\t'<<
	x[i].score<<'\t'<<x[i].num<<'\n';
	system("pause");
	return 0;	
}

这里的判断条件为score,效果如图

在这里插入图片描述

多个判断条件(以两个为例)

还是以上的代码,只要把cmp函数稍做修改就可以了。这里我们的第二给判断条件为num.

bool cmp(cj a,cj b)
{
	if(a.score!=b.score)
	return a.score>b.score;
	else
	return a.num>b.num;
}

效果如图

在这里插入图片描述

有更多条件也可以仿照两个条件的进行修改,要强调的是,多个条件中,越靠前的所起作用越大。

这里对于初学者不一定要懂为什么要这样写,只需要会用就好了。等到熟练之时可以再找资料更深层次地理解。有什么问题欢迎在评论区与我交流。

C++结构体自定义排序

声明:本机无C++环境,以下代码均没有编译测试,最近golang写的比较多,语法可能会有问题,请自行测试代码

sort排序函数简单使用 

#include <bits/stdc++.h>
using namespace std;
int a[100];
bool cmp1(int x,int y) {
	return x > y;
}
bool cmp2(int x,int y) {
	return x < y;
}
int main()
{
	//sort简单用法
	int n;
	scanf("%d",&n);
	/*
	1到n输入
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	sort(a+1,a+1+n); //默认从小到大排序
	*/
	/*
	0 到 n-1 输入 
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	sort(a,a+n);
	*/
	//从大到小排序需要写自定义优先级函数
	sort(a,a+n,cmp1); //采用cmp1函数排序 从大到小
	sort(a,a+n,cmp2); //采用cmp2函数排序 从小到大
   return 0;
}

结构体的自定义排序

例如 对于时间排序 年月日

#include <bits/stdc++.h>
using namespace std;
/*
//结构体排序两种写法 写法1 结构体内部 重载<运算符
struct node {
	int year,month,day;
	node() {year=0,month=0,day=0;}
	node(int y,int m,int d) { year=y,month=m,day=d;}
	bool operator< (const node &p) const { //重载<函数 内部写小于逻辑
		if (year == p.year && month == p.month) {
			return day < p.day;
		}
		if (year == p.year) {
			return year < p.year;
		}
		return year < p.year;
	}
};
//写法2 定义结构体后 写自定义排序函数
struct node {
	int year,month,day;
	node() {year=0,month=0,day=0;}
	node(int y,int m,int d) { year=y,month=m,day=d;}
};
bool cmp(const node &p,const node &q) { //语句不同 实现排序效果同方法1 const不可省略
	if (p.year != q.year) return p.year < q.year;
	if (p.month != q.month) return p.month < q.month;
	return p.day < q.day;
}
*/
node t[100];
int main()
{
	t[0] = node{2019,1,20};
	t[1] = node{2019,1,22};
	t[2] = node{2018,2,1};
	t[3] = node{2020,1,1};
	/* 方法1
	sort(t,t+4);
	方法2
	sort(t,t+4,cmp);
	*/
	for (int i=0;i<4;i++) {
	    printf("%d %d %d\n",t[i].year,t[i].month,t[i].day);
	}
   return 0;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++ 配置文件管理神器 yaml-cpp 实战指南

    C++ 配置文件管理神器 yaml-cpp 实战指南

    本文主要介绍了C++ 配置文件管理神器 yaml-cpp 实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • C++玫瑰花字符画项目实战教程

    C++玫瑰花字符画项目实战教程

    本文介绍了C++字符艺术——以“玫瑰花代码”为例,从字符选择、循环与条件控制、对称性实现、函数组织和用户交互等方面,讲解如何用C++编写和优化字符图案,并支持个性化定制和动态图案生成
    2025-10-10
  • vscode 配置 C/C++编译环境(完整教程)

    vscode 配置 C/C++编译环境(完整教程)

    这篇文章主要介绍了vscode 配置 C/C++编译环境(完整教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • C++实现简易通讯录功能

    C++实现简易通讯录功能

    这篇文章主要为大家详细介绍了C++实现简易通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • exec()函数在C++中的应用及其用法

    exec()函数在C++中的应用及其用法

    exec()函数在C++中是一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程的代码和数据,创建新的进程运行其他程序。exec()函数有多个版本,例如execl、execv、execle、execve等,根据不同的参数类型和个数来使用
    2023-05-05
  • VC++基于Dx实现的截图程序示例代码

    VC++基于Dx实现的截图程序示例代码

    这篇文章主要介绍了VC++基于Dx实现的截图程序示例代码,比较实用的功能,需要的朋友可以参考下
    2014-07-07
  • 五个经典链表OJ题带你进阶C++链表篇

    五个经典链表OJ题带你进阶C++链表篇

    做题之前呢,小编想提醒下大家,要三思而后行,不要一上来就嘎嘎敲代码,要先学会自己画图分析,把自己的思路捋清楚,不要到时候写代码五分钟,调试两小时,记住,编程思路很重要
    2022-03-03
  • C++使用sort对容器排序的实现

    C++使用sort对容器排序的实现

    C++ STL 标准库中的sort()函数专门用来对容器或普通数组中指定范围内的元素进行排序,本文就详细的介绍一下怎么实现,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C/C++ 中extern关键字详解

    C/C++ 中extern关键字详解

    这篇文章主要介绍了C/C++ 中extern关键字详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++析构函数内部工作机制详解

    C++析构函数内部工作机制详解

    析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~符号
    2023-02-02

最新评论