C25.【C++ Cont】初识运算符的重载和sort函数

news2025/1/29 7:41:01

目录

1.为什么要引入运算符重载

2.运算符重载写法

格式

例子

示例代码

运行结果

3.sort函数

两种声明

声明1:默认情况

参数

示例代码1:排整型

示例代码2:排浮点数

​编辑

示例代码3:排字符串

声明2:自定义情况

参数

comp比较函数的两种写法

写法1:创建比较函数

示例代码4:排降序

写法2:结构体中重载()运算符-仿函数

示例代码5:排降序

4.对比C语言的strcmp和C++的sort函数在按字典序为结构体排序

1.C语言代码

2.C++代码


1.为什么要引入运算符重载

#include <iostream>
using namespace std;
struct s
{
	int i;
	char c;
	float f;
	s()
	{
		i = 1;
		c = 'c';
		f = 3.14;
	}
};

int  main()
{
	s s1;
	cout << s1.i << s1.c << s1.f << endl;
	return 0;
}

cout语句写的有点麻烦,能不能直接使用cout<<s1<<endl来进行打印呢?

在VS上编译会报错

解决这个问题,需要运算符重载,即在C++中要针对自定义类型的变量,使用 cout 和 << 来输出变量的内容,就要对<<这个输出运算符进行重载

2.运算符重载写法

格式

返回类型 operator需要重载的运算符(参数列表)
{
    函数体;
}

例子

如果是cout的<<运算符重载,则返回类型为ostream&

ostream& operator<<(ostream&os,s& s1)
{
	os << s1.i << s1.c << s1.f << endl;
	return os;
}

示例代码

#include <iostream>
using namespace std;
struct s
{
	int i;
	char c;
	float f;
	s()
	{
		i = 1;
		c = 'c';
		f = 3.14;
	}
};

ostream& operator<<(ostream&os,s& s1)
{
	os << s1.i << s1.c << s1.f << endl;
	return os;
}

int  main()
{
	s s1;
	cout<<s1<<endl;
	return 0;
}

运行结果

3.sort函数

使用前要包含<algorithm>头文件

两种声明

声明1:默认情况

//default (1)	
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

备注:有关template和class方面的知识这里不做介绍,在竞赛中只需要明白参数的含义以及如何调用即可

参数

first:指向要排序范围的第一个元素的迭代器或者指针

last:指向要排序范围的最后一个元素之后位置的迭代器或者指针

声明1为sort函数的默认情况,默认排升序

示例代码1:排整型
#include <iostream>
#include <algorithm> 
using namespace std;
int  main()
{
	int arr[]={1,5,2,5,7,43,2,7,0,6};
	sort(arr,arr+sizeof(arr)/sizeof(arr[0]));
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
		cout<<arr[i]<<" ";
	return 0;
}

运行结果

示例代码2:排浮点数
#include <iostream>
#include <algorithm> 
using namespace std;
int  main()
{
	float arr[]={1.4,5.23,2.56,5.55,7.14};
	sort(arr,arr+sizeof(arr)/sizeof(arr[0]));
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
		cout<<arr[i]<<" ";
	return 0;
}

运行结果

示例代码3:排字符串
#include <iostream>
#include <algorithm> 
using namespace std;
int  main()
{
	string s="ajisfdhvajiw"; 
	sort(s.begin(),s.end());
	cout<<s;
	return 0;
}

注:s.end()返回指向字符串最后一个字符的下一个位置的迭代器(在C13.【C++ Cont】初识string类字符串的迭代器文章讲过),因此不用写成sort(s.begin(),s.end()+1);

运行结果

声明2:自定义情况

由于默认情况只能排升序,但可以自定义排降序或者排其他类型的数据(例如结构体)

//custom (2)	
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
参数

first和last参数同默认情况说明的

comp为自定义比较函数或函数对象,用于指定排序方法(默认情况下没有这个参数,这是自定义情况和默认情况不同的地方),可以类比之前在119.【C语言】数据结构之快速排序(调用库函数)文章讲过的qsort函数

注意:comp必须返回类型为bool型,如果第一个参数应该排在第二个参数之前,则返
回 true(不会交换),否则返回false(会交换)

comp比较函数的两种写法
写法1:创建比较函数
示例代码4:排降序
#include <iostream>
#include <algorithm> 
using namespace std;
bool comp(int a,int b)
{
	return a>b; 
}

int  main()
{
	int arr[]={1,5,2,5,7,43,2,7,0,6};
	sort(arr,arr+sizeof(arr)/sizeof(arr[0]),comp);
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
		cout<<arr[i]<<" ";
	return 0;
}

解释return a>b;

a>b如果为真,则不需要交换a和b,顺序是正确的(return true)

a>b如果为假,即a<b,则需要交换a和b,顺序是错误的(return false),交换后变为a>b,即排降序

运行结果

写法2:结构体中重载()运算符-仿函数

仿函数也叫函数对象,竞赛中不需要了解原理,只需要会用即可

示例代码5:排降序
#include <iostream>
#include <algorithm> 
using namespace std;
struct cmp
{
	bool operator()(int a,int b)//()运算符重载
	{
		return a>b; 
	}
}comp; 

int  main()
{
	int arr[]={1,5,2,5,7,43,2,7,0,6};

    //将结构体对象作为第三个参数传入sort函数中
	sort(arr,arr+sizeof(arr)/sizeof(arr[0]),comp);
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
		cout<<arr[i]<<" ";
	return 0;
}

运行结果

4.对比C语言的strcmp和C++的sort函数在按字典序为结构体排序

1.C语言代码

给定下列结构体,要求对姓名按字典序升序输出

struct Stu
{
	char name[10];
	short score;
};
struct Stu s[] = {
                   {"zhang",95},
		           {"wang",74},
				   {"li",83},
				   {"sun",90},
				   {"qian",66}
				 };

main代码

#include <stdio.h>
#include <string.h>
int main()
{
	int sz = sizeof(s) / sizeof(s[0]);
	for (int i = 0; i < sz; i++)
	{
		for (int j = i + 1; j < sz; j++)
		{
			if (strcmp(s[i].name, s[j].name)<0)
			{
				struct Stu tmp = s[i];//结构体可以直接赋值
				s[i] = s[j];
				s[j] = tmp;
			}
		}
	}		
	for (int k = 0; k < sz; k++)
	{
		printf("%s,%d\n", s[k].name, s[k].score);
	}
    return 0;
}

运行结果

2.C++代码

给定下列结构体,要求对姓名按字典序升序输出

struct Stu
{
	string name;
	short score;
};
struct Stu s[] = {
                   {"zhang",95},
		           {"wang",74},
				   {"li",83},
				   {"sun",90},
				   {"qian",66}
				 };

main代码

#include <iostream>
#include <algorithm>

//不用传struct Stu&,comp_by_name只是提供一个比较规则,实际在排序是还是取决于sort
bool comp_by_name(struct Stu a, struct Stu b)
{
	return a.name < b.name;
}

int main()
{
	int sz = sizeof(s) / sizeof(s[0]);
	sort(&s[0], &s[sz], comp_by_name);
	for (int k = 0; k < sz; k++)
	{
		cout << s[k].name << " " << s[k].score << endl;
	}
}

注:comp_by_name也可以写成仿函数的形式

struct cmp
{
	bool operator()(struct Stu a, struct Stu b)
	{
		return a.name < b.name;
	}
}comp_by_name;

int main()
{
	int sz = sizeof(s) / sizeof(s[0]);
	sort(&s[0], &s[sz], comp_by_name);
	for (int k = 0; k < sz; k++)
	{
		cout << s[k].name << " " << s[k].score << endl;
	}
}

运行结果

与C++代码对比,C语言代码可以看到比较麻烦,而C++代码非常简洁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#xff1a;如果只是贪心的话&#xff0c;容易被局部最大解锁定 方法有&#xff1a;盲目搜索&#xff0c;启发式搜索 盲目搜索&#xff1a;枚举法和蒙特卡洛模拟&#xff0c;但是样例太多花费巨量时间 所以启发式算法就来了&#xff0c;通过经验和规…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

实战网络安全:渗透测试与防御指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要课题。网络攻击的复杂性与日俱增&#xff0c;从数据泄露…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…

详解最基本的数据顺序存储结构:顺序表

新的一年&#xff0c;我觉得这张图很合适&#xff01;有梦想&#xff0c;敢拼&#xff0c;马上就是除夕了&#xff0c;希望新的一年我们逢考必过&#xff0c;事事顺心&#xff0c;看见朝阳的你是不是嘴角微微上扬&#xff01; 本篇从0基础白话文讲述顺序表的概念、用法、注意事…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

代码审查中的自动化与AI应用

代码审查&#xff08;Code Review&#xff09;作为软件开发中的一项重要实践&#xff0c;通常被认为是提高代码质量、减少bug和提升团队协作的重要手段。随着开发规模的不断扩大&#xff0c;手动代码审查在效率、准确性、以及可扩展性上都存在明显的局限性。尤其是在敏捷开发和…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组&#xff0c;这种问题就可以迎刃而解了 比如我们是4的话&#xff0c;我们从左向右开始存&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 到5的时候y就大于4了就是越界了&…

PostGIS笔记:PostgreSQL 数据库与用户 基础操作

数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异&#xff0c;只是说在 Windows 上虽然也能运行良好&#xff0c;但在性能、稳定性、功能扩展等方面&#x…

Nginx中部署多个前端项目

1&#xff0c;准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2&#xff0c;nginx里面的html文件夹中新建&#xff0c;tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3&#xff0c;编辑配置ngi…

人力资源管理HR系统的需求设计和实现

该作者的原创文章目录&#xff1a; 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…

2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文

模型设计思路与创新点&#xff1a; 建模的时候应该先确定我们需要建立什么类的模型&#xff1f;优化类还是统计类&#xff1f;这个题需要大量的数据分析&#xff0c;因此我们可以建立一个统计学模型。 统计学建模思路&#xff1a;观察规律&#xff0c;建立模型&#xff0c;参…

【太阳——几何计算】

题目 代码 #include <bits/stdc.h> using namespace std; using PII pair<int, int>; using ll long long; const int N 1e5 10; set<PII> s; bool st[N]; struct node {int x, y, id; } arr[2 * N]; int main() {int n, X, Y;cin >> n >> …

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道&#xff0c;通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

火语言RPA--配置文件读取

&#x1f6a9;【组件功能】&#xff1a;读取配置文件信息以字典类型输出。 配置预览 配置说明 要读取的文件 支持T或# 读取配置文件的路径及名称&#xff0c;绝对路径。 配置文件类型 INI或XML两种选项供选择。 编码 写入配置文件的编码&#xff0c;以列表方式供选择&am…

电子应用设计方案104:智能家庭AI弹簧床系统设计

智能家庭 AI 弹簧床系统设计 一、引言 智能家庭 AI 弹簧床系统旨在为用户提供更加舒适、个性化的睡眠体验&#xff0c;通过结合人工智能技术和先进的床垫设计&#xff0c;实时监测和调整睡眠环境&#xff0c;以满足不同用户的需求。 二、系统概述 1. 系统目标 - 自动适应用户…

基于paddleocr的表单关键信息抽取

全流程如下&#xff1a; 数据集 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集&#xff0c;共包含七个数据集&#xff0c;每个数据集包含149张训练集和50张验证集分别为&#xff1a; ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)&a…