C25.【C++ Cont】初识运算符的重载和sort函数
目录
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++代码非常简洁
相关文章:
C25.【C++ Cont】初识运算符的重载和sort函数
目录 1.为什么要引入运算符重载 2.运算符重载写法 格式 例子 示例代码 运行结果 3.sort函数 两种声明 声明1:默认情况 参数 示例代码1:排整型 示例代码2:排浮点数 编辑 示例代码3:排字符串 声明2:自定义情况 参数 comp比较函数的两种写法 写法1:创建比较函…...
粒子群算法 笔记 数学建模
引入: 如何找到全局最大值:如果只是贪心的话,容易被局部最大解锁定 方法有:盲目搜索,启发式搜索 盲目搜索:枚举法和蒙特卡洛模拟,但是样例太多花费巨量时间 所以启发式算法就来了,通过经验和规…...
深入理解若依RuoYi-Vue数据字典设计与实现
深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components:数据字典组件、字典标签组件 工具目录src/utils:字典工具类 store目录src/store:字典数据 main.js:字典数据初始化 页面使用字典例子…...
实战网络安全:渗透测试与防御指南
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在数字化时代,网络安全已成为企业和个人不可忽视的重要课题。网络攻击的复杂性与日俱增,从数据泄露…...
SpringBoot+Electron教务管理系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootElectron框架开发的教务管理系统。首先ÿ…...
正在更新丨豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)
文章目录 豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)写在前面数据采集0.注意事项1.创建Scrapy项目`douban2025`2.用`PyCharm`打开项目3.创建爬虫脚本`douban.py`4.修改`items.py`的代码5.修改`pipelines.py`代码6.修改`settings.py`代码7.启动`doub…...
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 安装 前言 如果您觉…...
详解最基本的数据顺序存储结构:顺序表
新的一年,我觉得这张图很合适!有梦想,敢拼,马上就是除夕了,希望新的一年我们逢考必过,事事顺心,看见朝阳的你是不是嘴角微微上扬! 本篇从0基础白话文讲述顺序表的概念、用法、注意事…...
STM32使用VScode开发
文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…...
前端react后端java实现提交antd form表单成功即导出压缩包
前端(React Ant Design) 1. 创建表单:使用<Form>组件来创建你的表单。 2. 处理表单提交:在onFinish回调中发起请求到后端API,并处理响应。 import React from react; import { Form, Input, Button } from ant…...
vue2中trhee.js加载模型展示天空盒子
创建相机 this.camera new THREE.PerspectiveCamera(45,this.viewNode.clientWidth / t…...
安装Office自定义项,安装期间出错
个人博客地址:安装Office自定义项,安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后,打开“WPS文字”时出现下图错误: 解决方法: 按“WinR”快捷键,打开【运行】框,在对话框中输入“re…...
代码审查中的自动化与AI应用
代码审查(Code Review)作为软件开发中的一项重要实践,通常被认为是提高代码质量、减少bug和提升团队协作的重要手段。随着开发规模的不断扩大,手动代码审查在效率、准确性、以及可扩展性上都存在明显的局限性。尤其是在敏捷开发和…...
蓝桥杯模拟算法:蛇形方阵
P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组,这种问题就可以迎刃而解了 比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了&…...
PostGIS笔记:PostgreSQL 数据库与用户 基础操作
数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异,只是说在 Windows 上虽然也能运行良好,但在性能、稳定性、功能扩展等方面&#x…...
Nginx中部署多个前端项目
1,准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2,nginx里面的html文件夹中新建,tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3,编辑配置ngi…...
人力资源管理HR系统的需求设计和实现
该作者的原创文章目录: 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…...
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
模型设计思路与创新点: 建模的时候应该先确定我们需要建立什么类的模型?优化类还是统计类?这个题需要大量的数据分析,因此我们可以建立一个统计学模型。 统计学建模思路:观察规律,建立模型,参…...
【太阳——几何计算】
题目 代码 #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. 中断服务函数 串口通信 概论 我们知道,通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…...
云原生时代,如何构建高效分布式监控系统
文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目,由于其良好的架构设计和完善的生态,迅速成为了监控…...
mysql从全备文件中提取单库或单表进行恢复——筑梦之路
前提条件 与业务确认涉及业务、数据库IP、数据误删除时间点、数据删除涉及的SCHEMA、数据表,确认该数据库为MySQLdump备份方式,备份策略为每日凌晨1点进行数据库全备份,备份保留7天,业务误删除数据时间点为当日10点左右࿰…...
渗透测试技法之口令安全
一、口令安全威胁 口令泄露途径 代码与文件存储不当:在软件开发和系统维护过程中,开发者可能会将口令以明文形式存储在代码文件、配置文件或注释中。例如,在开源代码托管平台 GitHub 上,一些开发者由于疏忽,将包含数据…...
火语言RPA--配置文件读取
🚩【组件功能】:读取配置文件信息以字典类型输出。 配置预览 配置说明 要读取的文件 支持T或# 读取配置文件的路径及名称,绝对路径。 配置文件类型 INI或XML两种选项供选择。 编码 写入配置文件的编码,以列表方式供选择&am…...
电子应用设计方案104:智能家庭AI弹簧床系统设计
智能家庭 AI 弹簧床系统设计 一、引言 智能家庭 AI 弹簧床系统旨在为用户提供更加舒适、个性化的睡眠体验,通过结合人工智能技术和先进的床垫设计,实时监测和调整睡眠环境,以满足不同用户的需求。 二、系统概述 1. 系统目标 - 自动适应用户…...
基于paddleocr的表单关键信息抽取
全流程如下: 数据集 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集,共包含七个数据集,每个数据集包含149张训练集和50张验证集分别为: ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)&a…...
爬虫基础之爬取某基金网站+数据分析
声明: 本案例仅供学习参考使用,任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …...
深入理解动态规划(dp)--(提前要对dfs有了解)
前言:对于动态规划:该算法思维是在dfs基础上演化发展来的,所以我不想讲的是看到一个题怎样直接用动态规划来解决,而是说先用dfs搜索,一步步优化,这个过程叫做动态规划。(该文章教你怎样一步步的…...
(1)STM32 USB设备开发-基础知识
开篇感谢: 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …...
基于STM32单片机设计的宠物喂食监控系统
1. 项目开发背景 随着宠物数量的增加,尤其是人们对宠物的养护需求日益增多,传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率,特别是对于宠物喂食、饮水、温湿度控制等方面的智能…...

