【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)

目录

一、sort

1.1sort简介

语法

参数

功能

适用容器

1.2sort的用法

1.3自定义比较函数 

示例

1265蓝桥题 —— 排序

二、min和max函数

三、min_element和max_element

 497蓝桥题 —— 成绩分析

四、nth_element


一、sort

1.1sort简介

  • sort函数包含在头文件<algorithm>中。
  • 在使用前需要#include <algorithm>或使用万能头文件。
  • sort是C++标准库中的一个函数模板,用于对指定范围内的元素进行排序。
  • sort算法使用的是快速排序 (QuickSort) 或者类似快速排序的改进算法,具有较好的平均时间复杂度,一般为O(nlogn)

语法

Sort(start,end,cmp)

参数

(1)start表示要排序数组的起始地址;

(2)end表示数组结束地址的下一位;

(3)cmp用于规定排序的方法,可不填,默认升序。

功能

sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。

一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)。而sort函数的强大之处在可与cmp函数结合使用,即自定义排序:如果你想按照特定的顺序排序,可以传递一个自定义的比较函数或lambda表达式给sort()。这个函数应该接受两个参数,并返回一个布尔值,指示第一个参数是否应该在排序后位于第二个参数之前。

相对于普通的排序算法,sort()函数在快速排序(详见C++快速排序)的基础上,又进行了优化,时间复杂度为n*log2(n),执行效率较高。

适用容器

sort()函数适用于数组和提供了随机访问迭代器的大多数STL容器,如vector、deque等。对于不支持随机访问迭代器的容器(如list、forward_list),应使用list容器自己的sort()成员函数。

int main()
{//sort(起始地址,   结束地址的下一位, *比较函数);//   迭代器begin()  end()         默认用小于号<int a[1000];int n;//读取数组大小cin >> n;//读取数组元素for (int i = 1; i <= n; ++i)cin >> a[i];//对数组进行排序sort(a + 1, a + n + 1);//    a[1]    a[n+1]  [1,n+1) 左闭右开//输出for (int i = 1; i <= n; ++i)cout << a[i] << ' ';
}

1.2sort的用法

std::sort(begin, end);

begin和end是输入序列的起始迭代器和结束迭代器。需要注意的是,end迭代器指向的是序列尾部的"过去位置",即最后一个有效元素之后的位置。

int main()
{//初始化vvector<int>v = { 5,1,3,9,11 };//        begin  v[0]    v[4]  end()//对数组进行排序sort(v.begin(), v.end());//输出//for (int i = 0; i < v.size(); ++i)cout << v[i] << ' ';for (auto& i : v)cout << i << ' ';return 0;
}

1.3自定义比较函数 

使用sort()我们不仅仅可以从大到小排或者从小到大排,还可以按照一定的准则进行排序。比如说我们按照每个数的个位进行从大到小排序,我们就可以根据自己的需求来写一个函数作为排序的准则传入到sort()中。

//sort默认使用小于号进行排序,如果想要自定义比较规则,
//可以传入第三个参数,可以是函数或lambda表达式(匿名函数)
bool cmp(const int& u, const int& v)
{return u > v;
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//初始化vector<int> v = { 5,1,3,9,11 };//对数组进行排序,降序排序sort(v.begin(), v.end(),cmp);//输出/*for (int i = 0; i < v.size(); ++i)cout << v[i] << ' ';*/for (auto& i : v)//就是v中的数据{cout << i << ' ' ;}
}

 sort默认使用小于号进行排序,如果想要自定义比较规则
可以传入第三个参数,可以是函数或lambda表达式(匿名函数)。

int main()
{//初始化vvector<int>v = { 5,1,3,9,11 };//对数组进行排序,降序排序sort(v.begin(), v.end(), [](const int& u, const int& v){return u > v;});//输出//for (int i = 0; i < v.size(); ++i)cout << v[i] << ' ';for (auto& i : v)//就是v中的数据{cout << i << ' ' ;}return 0;
}

结构体可以将小于号重载后进行排序,当然,用前面的方法也是可行的 

struct Node
{int u, v;bool operator<(const Node& m)const//重载的operator<是一个成员函数,//它接受一个const Node&类型的参数(即对另一个Node对象的常量引用),//并返回一个bool类型的结果。{//以u为第一关键字,v为第二关键字排序return u == m.u ? v < m.v : u < m.u;}
};#include <iostream>
using namespace std;
int main()
{int n; cin >> n;return 0;
}

示例

#include<iostream>  
#include<string>  
#include<algorithm>  
using namespace std;  struct Student{  string name;  // 学生姓名  double score[4];  // 学生四门课的成绩  
};  // 比较函数,用于sort排序,按照平均成绩从高到低排序  
bool cmp_score(const Student &x, const Student &y){  double average_x = 0.0, average_y = 0.0;  for(int i = 0; i < 4; i++){  average_x += x.score[i];  average_y += y.score[i];  }  average_x /= 4;  average_y /= 4;  return average_x > average_y;  
}  int main(){  Student stu[3];  // 存储三个学生的信息  // 输入三个学生的姓名和四门课的成绩  for(int i = 0; i < 3; i++){  cin >> stu[i].name;  for(int j = 0; j < 4; j++){  cin >> stu[i].score[j];  }  }  // 使用sort函数,按照平均成绩从高到低排序  sort(stu, stu + 3, cmp_score);  // 输出排序后的学生信息  for(int i = 0; i < 3; i++){  cout << stu[i].name << " ";  for(int j = 0; j < 4; j++){  cout << stu[i].score[j] << " ";  }  cout << endl;  // 换行  }  return 0;  
}

1265蓝桥题 —— 排序

#include <bits/stdc++.h> // 包含了C++标准库中的大部分头文件  using namespace std; // 使用标准命名空间std  const int N = 5e5 + 3; // 定义一个常量N,其值为500003,作为数组a的最大可能大小  
int a[N]; // 定义一个全局数组a,大小为N  int main() 
{  int n; cin >> n; // 输入一个整数n,表示数组a中实际元素的数量  for (int i = 1; i <= n; ++i) cin >> a[i]; // 从a[1]开始(而不是通常的a[0]),输入n个整数到数组a中  sort(a + 1, a + 1 + n); // 对数组a中从a[1]到a[n]的元素进行排序  // 以升序打印数组a中的元素  for (int i = 1; i <= n; ++i)  cout << a[i] << " \n"[i == n]; // 打印每个元素和一个空格,如果i等于n(即最后一个元素),则打印换行符  // 这里使用了字符串字面量" \n"的数组索引技巧:// 当i==n时,[i==n]求值为[1],选择'\n';否则为[0],选择' '  // 以降序打印数组a中的元素  for (int i = n; i >= 1; --i)  cout << a[i] << " \n"[i == 1];// 类似地,打印每个元素和一个空格,如果i等于1(即最后一个要打印的元素),则打印换行符  return 0; 
}

二、min和max函数

  • min和max函数
  • min(a,b)返回a和b中较小的那个值,只能传入两个值,或传入一个列表
  • 例如:
  • min(3, 5) = 3
  • min({1, 2, 3,4)) = 1
  • max(a,b)返回a和b中较大的那个值,只能传入两个值,或传入一个列表
  • 例如:
  • max(7,5)= 7
  • max([1, 2,3,4) = 4
  • 时间复杂度为O(1),传入参数为数组时时间复杂度为O(n),n为数组大小。
  • min,max函数是在取最值操作时最常用的操作。

三、min_element和max_element

min_element 和 max_element

头文件:#include<algorithm>

作用:返回容器中最小值和最大值的指针。max_element(first,end,cmp);其中cmp为可选择参数!

  • min_element(st,ed)返回地址[st,ed)中最小的那个值的下标(选代器),传入参数为两个地址或迭代器。
  • max_element(st,ed)返回地址[st,ed)中最大的那个值的下标 (选代器),传入参数为两个地址或迭代器。
  • 时间复杂度均为O(n),n为数组大小(由传入的参数决定)。
int main()
{//初始化vector<int>v = { 5,1,3,9,11 };//			   [			)//输出最大的元素,*表示解引用,即通过地址(迭代器)得到值cout << *max_element(v.begin(), v.end()) << '\n';}

 497蓝桥题 —— 成绩分析



用户登录

#include <bits/stdc++.h> 
using namespace std;      const int N = 1e4 + 9;    
int a[N];                 int main() // 主函数  
{  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 加速输入输出流  int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; int mx = a[1], mi = a[1]; // 初始化最大值mx和最小值mi为数组的第一个元素a[1]  for (int i = 1; i <= n; ++i) // 遍历数组a中的所有元素  {  mx = max(mx, a[i]); // 更新最大值mx  mi = min(mi, a[i]); // 更新最小值mi  }  cout << mx << '\n' << mi << '\n'; // 输出最大值和最小值,每个值后面跟一个换行符  long long sum = 0; // 定义一个长整型变量sum,用于存储数组a中所有元素的总和  for (int i = 1; i <= n; ++i) sum += a[i]; // 遍历数组a,计算所有元素的总和  cout << fixed << setprecision(2) << 1.0 * sum / n << '\n'; // 输出平均值,保留两位小数  // 注意:这里使用1.0 * sum将sum转换为浮点数,以确保进行浮点数除法  return 0; // 程序执行成功,返回0  
}

四、nth_element

  • nth_element()进行部分排序,返回值为void()
  • 传入参数为三个地址或迭代器。其中第二个参数位置的元素将处于正确位置,其他位置元素的顺序可能是任意的,但前面的都比它小,后面的都比它大
  • nth_element()是c++的STL库中的函数,作用是将数组中第k小的整数放在区间第k个位置
  • 比如vector<int> nums = {9, 7, 5, 11, 12, 2, 14, 3, 10, 6};
  • nth_element 会重新排列序列,使得第5小的元素位于正确的位置(索引为4的位置),且该元素之前的所有元素都不大于它,之后的元素都不小于它。
  • 使用一次nth_element()的时间复杂度为O ( n )。

int main()
{// 初始化一个包含7个整数的vector  vector<int> v = { 5,1,7,3,10,18,9 };// 使用nth_element进行部分排序  // 将v中的元素重新排列,使得v[3]位置上的元素位于排序后应在的位置  // v[0]到v[2]的元素都不大于v[3],v[4]到v[6]的元素都不小于v[3]  nth_element(v.begin(), v.begin() + 3, v.end());// 输出vector中的元素  for (auto& i : v)cout << i << ' '; // 注意:这里应该使用' '空格而不是'\n'换行符  return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

Vue3组件库开发 之Button(2) 未完待续

Vue3组件库开发 之Button(1) 中新建项目&#xff0c;但未安装成功ESLINT 安装ESLINT npm install eslint vite-plugin-eslint --save-dev 安装eslint后&#xff0c;组件文件出现错误提示 添加第三方macros &#xff0c;虽然不是官网但很多开发者都是vue3开发人员 安装macros…

C++大学教程(第九版)6.29素数

题目 (素数)素数是只能被1和自已整除的整数。例如,235和7是素数而468和9不是素数 a)编写一个函数&#xff0c;确定一个数是否是素数。 b)在程序中使用这个函数&#xff0c;该程序确定和打印2 ~10000之间的所有素数。在确信已找到所有的素数之前&#xff0c;实际需测试这些数中…

基于PSO-BP神经网络的风电功率预测(MATLAB)

作品简介 &#xff1a;关注公众号“电击小子程高兴的MATLAB小屋”获取优惠 主要内容 该模型将粒子群算法与BP神经网络结合用于BP神经网络的训练&#xff0c;即优化BP网络中的连接权值和各项阈值&#xff0c;然后利用神经网络分布式并行处理优势、自适应学习能力以及较好的…

c++中的包装器 function

文章目录 前言包装器 function及模板的低效性修复问题 前言 C提供了多个包装器&#xff08;wrapper&#xff0c;也叫适配器adapter&#xff09;。这些对象用于给其他编程接口提供更一致或更合适的接口。 bind1st和bind2ed就是两个适配器&#xff0c;它们让接受两个参数的函数…

【.NET Core】多线程之线程池(ThreadPool)详解(二)

【.NET Core】多线程之线程池&#xff08;ThreadPool&#xff09;详解&#xff08;二&#xff09; 在上一篇《【.NET Core】多线程之线程池&#xff08;ThreadPool&#xff09;详解&#xff08;一&#xff09;》中我们详细讲解了&#xff0c;线程池概念&#xff0c;如何应用及…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现定时器

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 文章目录 一、定时器(1) 简介STM32定时器计算公式 (2) 示例代码&#xff08;基本定时功能&#xff09;(3) 仿真效果 &#xff08;基本定时功能&#xff09;(4) 示例代码&#xff08;PWM 呼吸灯&#xff09…

【GitHub项目推荐--12306 抢票助手 python】【转载】

这个项目名很干脆&#xff0c;不知道以为是 12306 网站的源码&#xff0c;其实不是这是全 GitHub最德高望重的抢票小助手&#xff0c;功能一直在更新&#xff0c;且现已支持 Python 3.6 以上版本。 开源地址&#xff1a;https://github.com/testerSunshine/12306

利用GPU加速自定义风格图像生成-利用GPU加速结合了ControlNet/ Lora的Stable Diffusion XL

点击链接完成注册&#xff0c;参加本次在线研讨会 https://www.nvidia.cn/webinars/sessions/?session_id240124-31319 随着AI技术的发展, 数字内容创建业务也变得越来越火热。生成式AI模型的发布, 让我们看到了人工智能在各行各业的潜力。您只需要用语言简单描述自己希望看…

【Java】Maven的安装与配置

初识Maven Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09; 提供了一套依赖管理机制 标准化的…

质疑鸿蒙系统的是什么人群?为什么要杠

《HarmonyOSNEXT星空版》已堵住大部分人质疑的嘴。就在本月1月18&#xff0c;华为鸿蒙生态千帆启航仪式正式&#xff0c;HarmonyOSNEXT鸿蒙星河版发布&#xff1a;全面自研。 架构层面&#xff0c;HarmonyOSNEXT不依赖传统的Unix内核和Linux内核&#xff0c;而是实现了AI大模型…

《高教学刊》是什么级别的期刊?是正规期刊吗?是核心期刊吗?

​标题解答 1、《高教学刊》是什么级别的期刊&#xff1f; 省级 2、《高教学刊》是核心期刊吗&#xff1f; 不是&#xff0c;只是封面有核心字样 《高教学刊》刊发高等教育教学与高教理论研究成果&#xff0c;交流高校教学与建设的改革措施和实践经验&#xff0c;探索高等教…

每天五分钟计算机视觉:掌握迁移学习使用技巧

本文重点 随着深度学习的发展,迁移学习已成为一种流行的机器学习方法,它能够将预训练模型应用于各种任务,从而实现快速模型训练和优化。然而,要想充分利用迁移学习的优势,我们需要掌握一些关键技巧。本文将介绍这些技巧,帮助您更好地应用迁移学习技术。 迁移学习的关键…

高客单价企业必读:私域运营趋势分析与实操技巧

一、深入挖掘&#xff1a;场景洞察的新维度 当我们收到销售的群发信息时&#xff0c;通常会感到被打扰或骚扰&#xff0c;这是因为这些信息通常是基于广泛的受众群体发送的&#xff0c;缺乏针对个体消费者的定制化和个性化。这种缺乏个性化的沟通方式很容易被消费者视为不必要…

Temu活动库存设置多少合适,Temu活动要押金吗?-站斧浏览器

Temu活动库存设置多少合适&#xff1f; 对于Temu活动库存的设置&#xff0c;并没有固定的标准。其设置应根据商品的特性、市场需求、以及您的销售目标等因素进行综合考虑。然而&#xff0c;以下是一些建议&#xff0c;可以帮助您做出决策&#xff1a; 商品特性&#xff1a;某…

C++中命名空间、缺省参数、函数重载

目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字&#xff0c;后面跟上命名空间的名字&#xff0c;结构框架有点类似结构体&#xff08;如图所示&#xff09; 上面的代码我一一进行讲解&#xff1a; 1.我们先来说第三行和main函…

MAXWELL

MAXWELL 一、maxwell是什么 maxwell 官网地址&#xff1a;http://maxwells-daemon.io/ 因为官网是纯英文的&#xff0c;倒是不难懂&#xff0c;但总觉得写的略粗糙&#xff08;也可能笔者英文水平确实拉胯&#xff0c;有待提高&#xff09;。所以还是自己百度了一下。 当my…

测试必须要知道的四个主要阶段

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

力扣hot100 反转链表 指针 递归 一题多解

Problem: 206. 反转链表 文章目录 思路&#x1f496; 迭代 双指针&#x1f496; 递归 思路 &#x1f468;‍&#x1f3eb; 大佬题解 &#x1f496; 迭代 双指针 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) /*** Definition for …

LLM RAG 多种方式装载LLM的实践

一、大模型系统中检索增强生成&#xff08;RAG&#xff09;的意义 当前大模型在处理特定领域或者高度专业化的查询时表现出知识缺失&#xff0c;当所需信息超出模型训练数据范围或需要最新数据时&#xff0c;大模型可能无法提供准确答案。基于行业SOP、行业标准、互联网实时信…

【Android 10】 BatteryController

学习了一下电池的相关模式&#xff0c;也就是它的观察者模式&#xff0c;先附上图 图应该挺清晰的&#xff0c;BatteryControllerImpl就是被观察者&#xff0c;BatteryControllerImpl重写了CallbackController的两个方法用于添加或移除观察者。 void addCallback(T listener);…