C++ 常用函数 (竞赛向)

news/2025/3/10 19:32:15/文章来源:https://www.cnblogs.com/zyihan-crz/p/18763445

Sort函数详细讲解

顾名思义,sort就是用来排序的函数,它根据具体的情形使用不同的排序办法,效率较高。

1.如何使用sort排序

​ sort函数的使用必须加上头文件“#include ”和 “using namespace std;”

具体使用方式如下:

sort(a,b,c);

其中a为:首元素地址,必填内容

b为:尾元素地址的下一个地址,必填内容

c为:比较函数(也即比较规则),非必填内容

a,b为必填内容,c根据实际情况填写,非必填,如果不填比较函数,则默认对给出的区间进行升序排序(字符串为字典序)

1.1对整型数组排序:

#include <iostream>
#include <algorithm>
using namespace std;int main(){int a[6] = {9, 4, 2, 5, 6, -1};cout << "排序前:";for(int i = 0;i < 6;i ++) cout << a[i] << " ";cout << endl;sort(a + 0, a+4);  //对a[0]~a[3]升序排序(从小到大)cout << "第一次排序:";for(int i = 0;i < 6;i ++) cout << a[i] << " ";cout << endl;sort(a, a+6);  //对a[0]~a[5]升序排序(从小到大)cout << "第二次排序:";for(int i = 0;i < 6;i ++) cout << a[i] << " ";return 0;
}

运行结果如下:

排序前:9 4 2 5 6 -1 
第一次排序:2 4 5 9 6 -1 
第二次排序:-1 2 4 5 6 9 

1.2对浮点型数组排序:

#include <iostream>
#include <algorithm>
using namespace std;int main(){double a[] = {1.1, -1,1, 2.5, -3.3, 5.5, 1.6};cout << "排序前:";for(int i = 0;i < 6;i ++) cout << a[i] << " ";cout << endl;sort(a, a+6);  //对a[0]~a[5]升序排序(从小到大)cout << "排序后:";for(int i = 0;i < 6;i ++) cout << a[i] << " ";cout << endl;return 0;
}

运行结果如下:

排序前:1.1 -1 1 2.5 -3.3 5.5 
排序后:-3.3 -1 1 1.1 2.5 5.5 

1.3对字符串(字符数组)排序:

#include <iostream>
#include <algorithm>
using namespace std;int main(){char a[] = {'I', 'L', 'O', 'V', 'E', 'U'};cout << "排序前:";for(int i = 0;i < 6;i ++) cout << a[i];cout << endl;sort(a, a+6);  //对a[0]~a[5]按照字典序排序cout << "排序后:";for(int i = 0;i < 6;i ++) cout << a[i];cout << endl;return 0;
}

运行结果如下:

排序前:ILOVEU
排序后:EILOUV

2.如何实现比较函数cmp

​ 下面介绍对于基本数据类型,结构体类型,进行自定义排序cmp的写法

具体方式如下:

2.1基本数据类型数组的排序:

​ 若比较函数不填,默认升序(或者字典序)排序,下面对int数组的排序;

#include <iostream>
#include <algorithm>
using namespace std;int main(){int a[] = {3, 5, 2, 1, 4};cout << "排序前:";for(int i = 0;i < 5;i ++)  cout << a[i] << " ";cout << endl;sort(a, a+5);cout << "排序后:";for(int i = 0;i < 5;i ++)  cout << a[i] << " ";return 0;
}

运行结果如下:

排序前:3 5 2 1 4 
排序后:1 2 3 4 5 

如果想要降序排序,那么我们就要用到cmp函数“告诉”sort何时交换元素,代码写法如下:

#include <iostream>
#include <algorithm>
using namespace std;bool cmp(int a, int b){return a > b; //可以理解为a > b时 就把a放前面
}int main(){int a[] = {3, 5, 2, 1, 4};cout << "排序前:";for(int i = 0;i < 5;i ++)  cout << a[i] << " ";cout << endl;sort(a, a+5, cmp);cout << "排序后:";for(int i = 0;i < 5;i ++)  cout << a[i] << " ";return 0;
}

运行结果如下:

排序前:3 5 2 1 4 
排序后:5 4 3 2 1 

​ 这样就可以让数值大的元素在前面,即降序排序,对于double,char亦如此,把cmp内传入的参数类型改一下就好了

2.2结构体数组的排序

现在定义了如下的结构体:

struct node{int x, y;
}ssd[10];

如果想要ssd数组按照x从大到小排序,可以这样写cmp函数:

bool cmp(node a, node b){return a.x > b.x;    
}

完整示例:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;struct node{int x, y;
}ssd[10];bool cmp(node a, node b){return a.x > b.x; //按照x降序排列 
}int main(){ssd[0].x=2; //{2,2} ssd[0].y=2;ssd[1].x=1; //{1,3}ssd[1].y=3;ssd[2].x=3; //{3,1}ssd[2].y=1;sort(ssd, ssd+3, cmp);for(int i=0;i<3;i++){printf("%d %d\n",ssd[i].x,ssd[i].y);}return 0;
}

运行结果如下:

3 1
2 2
1 3

如果想要先按照x降序,x相等时,y升序排列(二级排序),那么代码实现如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;struct node{int x, y;
}ssd[10];bool cmp(node a, node b){if(a.x!=b.x) return a.x>b.x;//按照x降序排列 else return a.y < b.y; //按照y升序排列 
}int main(){ssd[0].x=2; //{2,2} ssd[0].y=2;ssd[1].x=1; //{1,3}ssd[1].y=3;ssd[2].x=2; //{2,1}ssd[2].y=1;sort(ssd,ssd+3,cmp);for(int i=0;i<3;i++){printf("%d %d\n",ssd[i].x,ssd[i].y);}return 0;
}

运行结果如下:

2 1
2 2
1 3

C++全排列函数详解

C++STL中有两种关于全排列的函数:next_premutation() 与 prev_premutation()

接下来我们分别对两个函数进行讲解

1. next_premutation()函数

原理:

next_permutation()函数用于生成当前序列的下一个排列,它按照字典序对序列进行重新排列,如果存在下一个排列,则将当前序列更改为下一个排列,并返回true;如果当前序列已经是最后一个排列,则将序列更改为第一个排列,并返回false。

代码示例:

#include <iostream>  
#include <algorithm>  
using namespace std;  
int main()  
{  int num[3]={1,2,3};  do  {  //输出当前数组 cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl; //如果存在下一个排列就进入循环//存在就表明(next_permutation()的值为真,反之为假) }while(next_permutation(num,num+3)); //输出循环结束后的数组,验证“下一个排列不存在时数组是否被重新排列了,也即回到第一个排列” cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;return 0;  
}

运行结果:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2 3

2. prev_premutation()函数

原理:

prev_permutation()函数用于生成当前序列的上一个排列,它按照字典序对序列进行重新排列,如果存在上一个排列,则将当前序列更改为上一个排列,并返回true;如果当前序列已经是第一个排列,则将序列更改为最后一个排列,并返回false。

代码示例:

#include <iostream>  
#include <algorithm>  
using namespace std;  
int main()  
{  int num[3]={3,2,1};  do  {  //输出当前数组 cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl; //如果存在上一个排列就进入循环//存在就表明(prev_permutation()的值为真,反之为假) }while(prev_permutation(num,num+3)); //输出循环结束后的数组,验证“上一个排列不存在时数组是否被重新排列了也即回到最后一个排列” cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;return 0;  
}

运行结果:

3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
3 2 1

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

transformer 中的掩码类型

知识是我们已知的也是我们未知的基于已有的知识之上我们去发现未知的由此,知识得到扩充我们获得的知识越多未知的知识就会更多因而,知识扩充永无止境

如何设计、维护和推广 API:专业人士的实用指南

API 在今天的数字化环境中扮演着至关重要的角色,它们作为系统和应用程序之间的连接纽带。对于公司而言,打造用户喜爱的 API、有效地维护它们并成功地在内部和外部推广,不仅能提高数字价值,还能带来巨大的业务收益。 API 设计是创建一个标准化、易于理解且稳定的应用程序接口…

springboot引入nacos

springboot引入nacos 一、 环境准备(windows为例)安装nacos(github镜像网址:Releases alibaba/nacos) 推荐下载发行版启动nacos本地服务 下载完毕,建议解压到没有中文路径的文件夹,在bin目录下打开cmd对话框输入下面命令启动nacos startup.cmd -m standalone启动成功出现以…

95%开发者不知道的调试黑科技:Apipost让WebSocket开发效率翻倍的秘密

在现代 Web 开发中,Websocket 作为一种常见的 Web 协议,与 Restful API 有着本质的不同。Restful API是基于请求-响应模式的单向通信,而 WebSocket 提供全双工通信渠道,允许客户端和服务器之间进行实时双向数据传输。这种特性使得它在需要实时交互的场景中大放异彩,比如 I…

题解:P9221 「TAOI-1」Pentiment

P9221 解题报告 一眼线段树优化 dp,但是调了7h。 首先考虑朴素 dp,设 \(dp_{i,j}\) 表示走到第 \(i\) 行第 \(j\) 列的方案数,转移: \[dp_{i,j}=\sum dp_{i-1,k} \]其中 \(k\) 表示第 \(i\) 行可以走到 \(j\) 的列。 比如如果第 \(i\) 行是下面这种情况:当 \(j=3\) 时,\(…

【Java开发】Tools4AI:一个适用于企业Java应用的开源智能体框架

一、简介 GitHub主页:(https://github.com/vishalmysore/Tools4AI) Tools4AI 是一个基于 Java 的开源智能体框架,它为企业Java应用程序提供了一种集成人工智能的独特方法。作为一个大型动作模型(Large Action Model,LAM)智能体,Tools4AI 能够根据自然语言指令自主执行任务…

英语328个词缀和词根汇总(14张图)

在所有的单词记忆法中,构词法是最科学、记忆效果最佳的词汇记忆法。下面整理了高中常用的词根、词缀。利用有限的词根、词缀对英语单词进行构词分析和解形释义,单词变得好认又好记,词义也一目了然。通过构词法记单词,可以举一反三,记一识十,从而达到事半功倍的记忆效果。…

No.48 ES6---数组扩展之扩展运算符和新增方法

一、数组扩展之扩展运算符 1.扩展运算符扩展运算符(spread)是三个点(…)。将一个数组转为用逗号分隔的参数序列。<script>var arr = [10,23,45,6,7];//以前获取数组中的每个元素for(let i = 0;i<arr.length;i++){console.log(arr[i]);}//有了扩展运算符之后console.lo…

Zabbix 7.0 LTS 部署

Zabbix 7.0LTS教程 一、环境介绍 操作系统:Rocky Linux 9.5 软件版本:7.0LTS 二、安装教程 官网:Zabbix:企业级开源监控解决方案 点击右上角的下载ZABBIX选择对应的环境:选择之后往下拉会看到相应的部署步骤:2.1 软件源配置 按照文档提示:如果有epel.repo源码,需要先注释…

IDC机房无人值守:智能运维一体化解决方案

“智和网管平台”,通过实时监控、远程配置等技术实现数据中心机房的自动检测、自动报警、自动修复等功能,从而达到无需人工干预的机房运维状态,减少人为因素对设备运行的干扰,增强机房设备、设施数据的直观可视性、提高其利用率。 企业数字化转型以及5G、物联网、云…

rust学习二十.1、不安全代码之原始指针(裸指针)

一、前言 指针在前面的篇幅中已经介绍过许多,但主要是智能指针。 智能指针管理堆上的数据,并且受到rust的所有权和借用规则管理(注意,这里的所有权和借用有时候不同于最原始的那种)。 智能指针好歹能管着这些数据,但是rust中存在一些不能使用所有权管理的数据,它们需要利…