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

news2024/11/15 8:43:22

目录

一、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()
{
	//初始化v
	vector<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()
{
	//初始化v
	vector<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.coloradmin.cn/o/1403075.html

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

相关文章

如何在WordPress中使用 AI 进行 SEO(12 个工具)

您想在 WordPress 中使用 AI 进行 SEO 吗&#xff1f; 人工智能正在对 SEO 行业产生重大影响。已经有优秀的人工智能 SEO 工具&#xff0c;您可以使用它们来提高您的 SEO 排名&#xff0c;而无需付出太多努力。 在本文中&#xff0c;我们将向您展示如何通过我们精心挑选的工具…

Qt 开发环境配置 vs和Qt creator

Qt 开发环境配置 vs和Qt creator 1、安装的软件 1、vs_Enterprise.exe 2、Qt creator (最好是最新的版本,低版本不支持vs2019) 下载地址&#xff1a;https://gofile-3535697530.cn1.quickconnect.cn/sharing/zMCh5ENgZ 密码&#xff1a;qt_dev 2、Qt Creator配置 1、打开…

检索增强生成中的创新

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Innovations In Retrieval Augmented Generation 原文地址:https://medium.com/emalpha/innov…

springsecurity集成kaptcha功能

前端代码 本次采用简单的html静态页面作为演示&#xff0c;也可结合vue前后端分离开发&#xff0c;复制就可运行测试 项目目录 登录界面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</…

x-cmd pkg | speedtest-cli - 网络速度测试工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 speedtest-cli 是一个网络速度测试工具&#xff0c;用于测试计算机或服务器与速度测试服务器之间的网络连接速度。 它使用 speedtest.net 测试互联网带宽&#xff0c;可以帮助用户获取网络的上传和下载速度、延迟等参…

Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调…

stm32内存分配博客笔记

原文&#xff1a; stm32内存分配 笔记&#xff1a; 1、向量表与代码段&#xff1b;根据Cortex-M3权威指南描述&#xff0c;系统复位后&#xff0c;在向量表异常0处保存的是堆栈起始地址&#xff0c;而后紧跟中断向量表 2、可以从链接脚本.ld文件中看到终端向量表第一个被链接…

品牌百度百科词条怎么写?

在互联网时代&#xff0c;品牌的影响力愈发重要&#xff0c;而百度百科作为我国最大的百科全书&#xff0c;更是塑造品牌形象、传播品牌价值的重要平台。如何撰写一篇高质量的百度百科品牌词条&#xff0c;成为了众多企业和品牌关注的焦点。品牌百度百科词条怎么写&#xff1f;…

QGraphicsView前有QWidget遮罩,导致QGraphicsItem鼠标事件不响应

场景&#xff1a;在一个QWidget上放置了一个QGraphicsView用于显示图像&#xff0c;QGraphicsView设置了场景&#xff0c;并添加了一个自定义QGraphicsItem。由于需求原因&#xff0c;又绘制了一个标尺QWidget放在QGraphicsView前部。 结果导致标尺QWidget显示时&#xff0c;重…

系统IO

OS&#xff1a;操作系统 管理和分配硬件资源的系统软件&#xff0c;现代操作系统必须提供并发功能 介于应用与硬件之间的 在linux下做应用开发&#xff0c;其实就是调用操作系统提供的API函数的接口操作硬件 一、文件IO是什么&#xff1f; 文件IO分为系统IO和标…

代码随想录 Leetcode150. 逆波兰表达式求值

题目&#xff1a; 代码(首刷看解析 2024年1月21日&#xff09;&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &qu…

WSL2 git clone命令无法克隆远程仓库

问题描述 最近在往WSL2里拉取git仓库的时候&#xff0c;突然出现了这个问题&#xff0c;WSL2无法连接到git服务器&#xff0c;导致代码无法拉取下来&#xff0c;可能是因为我最近不小心修改了windows的防火墙设置&#xff0c;导致出现了这个问题。 解决办法 在查阅了很多篇…

浅析智能家居企业面临的组网问题及解决方案

在这个快速发展的时代&#xff0c;组网对于企业的发展来说是一个至关重要的环节。 案例背景&#xff1a; 案例企业是一家智能家居制造企业&#xff0c;在不同城市分布有分公司、店铺、工厂&#xff0c;这些点原本都是各自采购网络&#xff0c;与总部进行日常沟通、访问。 现在…

<C++>STL->list

list的介绍 list list是一个类模板&#xff0c;第一个模板参数为存储数据类型&#xff1b;第二个模板参数为空间适配器list是一个可以在常数时间内完成任意位置的插入和删除的顺序容器。list容器是以双链表的形式实现的&#xff1b;双链表可以将其包含的每个元素存储在不同且…

性能进阶:使用JMeter进行websocket测试【建议收藏】

本次测试案例主要是分享如何使用JMeter进行websocket协议下的聊天接口性能测试。 包含websocket插件的下载安装、线程组及sampler的设置、csv参数化和组建分布式测试的方法、如何通过调整参数来获得发压机的最大并发数以及对测试过程的总结。 整篇文章只侧重介绍进行websocke…

西圣H1头戴式耳机,百元性能小钢炮,舒适音质性能绝不妥协

近日&#xff0c;深耕智能声学领域多年的 xisem西圣品牌‏‏发布——‏西圣H1头戴式主动降噪蓝牙耳机正式迎来首销。从各个方面来看&#xff0c;这款头戴式耳机展现出了极具颠覆性的创新&#xff0c;不仅在音质和降噪性能上表现出色&#xff0c;更重要的是采用了更加轻巧的佩戴…

外包干了5个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

顺时针打印矩阵:偏移量法与边界控制法比较---剑指offer-JZ29 顺时针打印矩阵

在编程中&#xff0c;处理二维数组的问题可以有多种解法。今天&#xff0c;我们将探讨两种解决“顺时针打印矩阵”问题的方法&#xff1a;偏移量法和边界控制法&#xff0c;并进行比较。 题目 题目连接&#xff1a;顺时针打印矩阵_牛客题霸_牛客网 (nowcoder.com) 偏移量法 偏…

枚举类型有着一篇足以

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字&#xff0c;enum叫枚举数据类型&#…

Unity 编辑器篇|(十三)自定义属性绘制器(PropertyDrawer ,PropertyAttribute) (全面总结 | 建议收藏)

目录 1. 前言2. PropertyDrawer2.1 参数总览2.2 两种用途2.3 注意事项2.4 代码样例 3. PropertyDrawer与PropertyAttribute结合使用 1. 前言 在Unity中&#xff0c;PropertyDrawer和PropertyAttribute是两个重要的工具&#xff0c;它们主要用于自定义属性的显示和行为。Proper…