当前位置: 首页 > article >正文

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:创建比较函…...

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#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…...

正在更新丨豆瓣电影详细数据的采集与可视化分析(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 安装 前言 如果您觉…...

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

新的一年&#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查询…...

前端react后端java实现提交antd form表单成功即导出压缩包

前端&#xff08;React Ant Design&#xff09; 1. 创建表单&#xff1a;使用<Form>组件来创建你的表单。 2. 处理表单提交&#xff1a;在onFinish回调中发起请求到后端API&#xff0c;并处理响应。 import React from react; import { Form, Input, Button } from ant…...

vue2中trhee.js加载模型展示天空盒子

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/13b9193d6738428791fc1ff112e03627.png 加载模型的时候需要把模型放在public文件下面 创建场景 this.scene new THREE.Scene()创建相机 this.camera new THREE.PerspectiveCamera(45,this.viewNode.clientWidth / t…...

安装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;迅速成为了监控…...

mysql从全备文件中提取单库或单表进行恢复——筑梦之路

前提条件 与业务确认涉及业务、数据库IP、数据误删除时间点、数据删除涉及的SCHEMA、数据表&#xff0c;确认该数据库为MySQLdump备份方式&#xff0c;备份策略为每日凌晨1点进行数据库全备份&#xff0c;备份保留7天&#xff0c;业务误删除数据时间点为当日10点左右&#xff0…...

渗透测试技法之口令安全

一、口令安全威胁 口令泄露途径 代码与文件存储不当&#xff1a;在软件开发和系统维护过程中&#xff0c;开发者可能会将口令以明文形式存储在代码文件、配置文件或注释中。例如&#xff0c;在开源代码托管平台 GitHub 上&#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…...

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …...

深入理解动态规划(dp)--(提前要对dfs有了解)

前言&#xff1a;对于动态规划&#xff1a;该算法思维是在dfs基础上演化发展来的&#xff0c;所以我不想讲的是看到一个题怎样直接用动态规划来解决&#xff0c;而是说先用dfs搜索&#xff0c;一步步优化&#xff0c;这个过程叫做动态规划。&#xff08;该文章教你怎样一步步的…...

(1)STM32 USB设备开发-基础知识

开篇感谢&#xff1a; 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …...

基于STM32单片机设计的宠物喂食监控系统

1. 项目开发背景 随着宠物数量的增加&#xff0c;尤其是人们对宠物的养护需求日益增多&#xff0c;传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率&#xff0c;特别是对于宠物喂食、饮水、温湿度控制等方面的智能…...