STL常用算法——排序算法

2023-05-16

文章目录

  • STL常用算法——排序算法
    • 1、sort()
    • 2、random_shuffle()
    • 3、merge()
    • 4、reverse()

STL常用算法——排序算法

1、sort()

sort():对容器或普通数组中范围内的元素进行排序,默认进行升序排序,也可以自定义排序规则。

sort() 函数只对 array、vector、deque 这 3 个容器提供支持。

sort() 函数在对自定义的类对象实现排序时,需要在该类的内部提供移动构造函数和移动赋值运算符。

函数原型:该函数有以下两种语法格式

//对 [beg, end) 区域内的元素做默认的升序排序
sort (iterator beg,iterator end);
//按照指定的 comp 排序规则,对 [beg, end) 区域内的元素进行排序
sort (iterator beg,iterator end, Compare comp);  

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
  • comp 标准库提供的排序规则(如 greater<T>);或普通函数以及函数对象接收的自定义的排序规则

默认排序和标准库提供的排序

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	vector<int> v{1,4,5,3,2};
	//默认升序排序
	sort(v.begin(), v.end());//1 2 3 4 5
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	//从大到小排序,标准库提供的排序规则
	sort(v.begin(), v.end(), greater<int>());//5 4 3 2 1
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

自定义排序规则

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

void myPrint(int val) {
	cout << val << " ";
}
//以普通函数的方式实现自定义排序规则(升序)
bool mycomp(int i, int j) {
	return (i < j);
}
//以函数对象的方式实现自定义排序规则(升序)
class mycomp2 {
public:
	bool operator() (int i, int j) {
		return (i < j);
	}
};

void test01() {
	vector<int> v{ 32, 71, 12, 45, 26, 80, 53, 33 };
	
	sort(v.begin(), v.end(), mycomp);//12 26 32 33 45 53 71 80
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	
	sort(v.begin(), v.end(), mycomp2());//12 26 32 33 45 53 71 80
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

2、random_shuffle()

random_shuffle():指定范围内的元素随机调整次序

函数原型:

random_suffle(iterator beg,iterator end);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<ctime>

void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	//打乱顺序前的遍历
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	//打乱顺序后的遍历
	random_shuffle(v.begin(), v.end());
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	//加入随机数种子,使每次程序启动的随机数都不一样
	srand((unsigned int)time(NULL));
	test01();
	system("pause");
	return 0;
}

在这里插入图片描述

3、merge()

合并排序,merge() 函数用于将 2 个有序序列合并为 1 个有序容器,前提是这 2 个有序容器的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序容器,其排序规则也和这 2 个有序容器要相同。

函数原型:该函数有以下两种格式

//默认升序为排序规则,[beg1, end1) 和 [beg2, end2) 指定区域内的元素必须支持 < 小于运算符
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
//自定义的 comp 规则作为排序规则,[beg1, end1) 和 [beg2, end2) 指定区域内的元素必须支持comp 排序规则内的比较运算符
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest, Compare comp);

参数说明:

  • beg1 容器1开始迭代器
  • end1 容器1结束迭代器
  • beg2 容器2开始迭代器
  • end2 容器2结束迭代器
  • dest 目标容器开始迭代器,为最终生成的新有序序列指定存储位置
  • comp 用于自定义排序规则

默认排序

void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	//有序的容器
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i * 2);
	}
	//新有序容器
	vector<int> v3;
	//一定要提前给容器分配空间
	v3.resize(v1.size() + v2.size());

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	//打印出来的还是个有序序列
	for_each(v3.begin(), v3.end(), myPrint);//0 0 1 2 2 3 4 4 5 6 6 7 8 8 9 10 12 14 16 18
	cout << endl;
}

自定义排序规则

void myPrint(int val) {
	cout << val << " ";
}

//以普通函数的方式实现自定义排序规则(降序)
bool mycomp(int i, int j) {
	return (i > j);
}
//以函数对象的方式实现自定义排序规则(降序)
class mycomp2 {
public:
	bool operator() (int i, int j) {
		return (i > j);
	}
};

void test01() {
	//有序的容器
	vector<int> v1;
	vector<int> v2;
	for (int i = 10; i > 0; i--) {
		v1.push_back(i);
		v2.push_back(i * 2);
	}
	//新有序容器
	vector<int> v3;
	//一定要提前给容器分配空间
	v3.resize(v1.size() + v2.size());

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp);
	for_each(v3.begin(), v3.end(), myPrint);//20 18 16 14 12 10 10 9 8 8 7 6 6 5 4 4 3 2 2 1
	cout << endl;

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp2());
	for_each(v3.begin(), v3.end(), myPrint);//20 18 16 14 12 10 10 9 8 8 7 6 6 5 4 4 3 2 2 1
	cout << endl;
}

4、reverse()

reverse()函数:将容器指定范围内的元素进行反转

函数原型:

reverse(iterator beg,iterator end);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	vector<int> v1;
	//有序的容器
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	reverse(v1.begin(), v1.end());
	for_each(v1.begin(), v1.end(), myPrint);//9 8 7 6 5 4 3 2 1 0
	cout << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL常用算法——排序算法 的相关文章

  • HTTP基本认证(Basic Authentication)

    在浏览网页时候 xff0c 浏览器会弹出一个登录验证的对话框 xff0c 如下图 xff0c 这就是使用HTTP基本认证 1 客户端发送http request 给服务器 服务器验证该用户是否已经登录验证过了 xff0c 如果没有的话 xf
  • 将字符串以单词为单位逆序"I am a Student" 解法

    网上有个题目 xff0c 将字符串以单词为单位逆序 例如 34 I am a Student 34 要变成 34 Student a am I 34 解法大致为 xff1a 先将字符串整体逆序第一个字符和最后一个交换 xff0c 第二个与倒
  • 堆排序查找前N个最大数和二分查找算法

    先了解堆排序概念 堆排序利用了大根堆 xff08 或小根堆 xff09 堆顶记录的关键字最大 xff08 或最小 xff09 这一特征 xff0c 使得在当前无序区中选取最大 xff08 或最小 xff09 关键字的记录变得简单 xff08
  • 构建hash表和两种处理冲突方法

    hash表定义 hashing定义了一种将字符组成的字符串转换为固定长度 xff08 一般是更短长度 xff09 的数值或索引值的方法 xff0c 称为散列法 xff0c 也叫哈希法 由于通过更短的哈希值比用原始值进行数据库搜索更快 xff
  • 用hash_map统计出现次数最多的前N个URL

    海量数据统计频率最高词汇的常规办法之一是先通过一个hash函数处理数据然后取模N xff0c 拆分为N个小文件 xff0c 对每一个小文件进行词频统计和排序处理 xff0c 然后归并N个小文件取频率最大的M个数 下面程序是利用hash ma
  • C++与java语法的异同整理

    文章目录 Java与C 43 43 与基础语法异同java的认知 amp java与C 43 43 的异同C 43 43 中的虚函数和JAVA中的抽象方法区别C 43 43 虚函数与JAVA中抽象函数比较关于接口与抽象类 xff1a Jav
  • 微信公众平台-股票行情查询

    微信公众平台 股票行情查询 php实现的获取上证 xff0c 深证 A B股实时行情的接口 xff0c 只实现了文本消息回复 xff0c K线图可以在图文消息中加上接口url地址就可以显示 xff0c 具体的接口地址网上可以找 xff0c
  • PELCO-D与PELCO-P协议介绍

    一般控制协议都由硬件或软件商编制在程序里面 xff0c 我们只需要通过相关的控制设备来进行操作 但是作为一个从事监控行业的技术人员 xff0c 往往会遇到除了电脑和协议转换器以外根本没有任何控制设备的情况 xff0c 此时 xff0c 协议
  • ROS 问题(topic types do not match、topic datatype/md5sum not match、msg xxx have changed. rerun cmake)

    1 topic types 不匹配 使用 roslaunch 命令 roslaunch carla ros bridge carla ros bridge with example ego vehicle launch 启动官方 demo
  • Ubuntu中查看安装的Python版本以及不同版本之间切换

    查看系统中已安装的所有Python版本 使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用 xiyou 64 span class token property xiyou virtual machine span
  • Ubuntu Python 多版本安装

    概述 由于 Python 3 有几次较为跳跃的更新 xff0c 导致大量使用 Python 3 作为开发工具的软件会对 Python 3 的版本进行严格限制 xff0c 如限制使用 Python 3 8 Python 3 9 版本 这要求开
  • 怒爬某 Hub 资源就为撸了一个鉴黄平台

    来源 xff1a 码匠笔记公号 黄色已经是我们所不容然而却防不胜防的 xff0c 尤其是对于做内容的工具和平台 xff0c 所以花了30分钟搭建了一个鉴黄平台 xff0c 分享给大家 数据准备 找了 N 多资源都不能解决问题 xff0c 于
  • ROSERROR : datatype/md5sum

    出错原因是 xff1a 自定义消息 xff0c 发送话题的消息类型和接受话题的消息类型不一样 但是我的代码真的是一样的 所以 xff0c 解决办法是 xff1a 清空工作空间的build devel文件夹 xff0c 重新编译运行 成功 x
  • 学习使用 ArUco 标记

    在本文中 xff0c 我们将研究使用 Python 和 OpenCV 检测和估计 ArUco 标记的方向 首先 xff0c 我们将从生成 ArUco 标记开始 你可以使用特定网站一个一个地创建单个标签 xff0c 也可以使用我的程序生成整个
  • TCP协议中的序列号

    TCP 协议工作在OSI的传输层 xff0c 是一种可靠的面向连接的数据流协议 xff0c TCP之所以可靠 xff0c 是因为它保证了传送数据包的顺序 顺序是用一个序列号来保证的 响应包内也包括一个序列号 xff0c 表示接收方准备好这个
  • c++开发过程中遇到的问题及解决方案

    xfeff xfeff 问题一 xff1a 1 gt JForm obj error LNK2019 无法解析的外部符号 34 public virtual thiscall JFC JForm JForm void 34 1JForm 6
  • Digest Auth 摘要认证

    Digest Auth 摘要认证 1 非常规方式 转载 xff1a https blog csdn net qq 25391785 article details 86595529 public static void postMethod
  • 嵌入式C语言基础知识--位操作

    目录 大小端模式 xff1a 字节高低位 xff1a LSB和MSB xff1a 高位先行msb 低位先行lsb xff1a 串口传输是低位先行 IIC传输是高位先行 字节序 比特序 大端模式 小端模式 高字节序 低字节序 MSB LSB
  • qt 绘制 流程图 案例 收集

    参考 C 43 43 中的例子 xff1a Qt Qt5 11 1 Examples Qt 5 11 1 widgets graphicsview diagramscene The Diagram Scene example is an a
  • 获得GPS数据的两种方法 1.读串口

    获得GPS数据一般可通过两种方法 xff0c 读串口及调用gpsapi函数 串口作为硬件设备 xff0c 不能同时被两个程序占用 xff0c gpsapi函数几个应用程序可同时共享端口 1 xff0e 读串口 先找出 gps 使用的串口号

随机推荐

  • 机器人履带底盘的悬挂和传动

    我爸是坦克 xff01 一个履带机器人 一 前言 曾经调研过机器人履带底盘的设计和构造 xff0c 整理一下备忘 本文主要关注自己比较难理解的履带底盘悬挂机构和摇臂式履带底盘传动机构 其中履带底盘的悬挂涉及到克里斯蒂悬挂 xff08 Chr
  • Python爬虫——Scrapy 的基本使用

    文章目录 Python爬虫 Scrapy 的基本使用1 创建 Scrapy 爬虫项目2 Scrapy 创建爬虫文件3 Scrapy 运行爬虫文件 Python爬虫 Scrapy 的基本使用 Scrapy 框架中创建项目 查看配置信息 xff
  • Python爬虫——Scrapy框架使用实例及执行过程

    文章目录 Python爬虫 Scrapy框架使用实例及执行过程1 Scrapy框架使用实例2 Scrapy框架执行过程 Python爬虫 Scrapy框架使用实例及执行过程 1 Scrapy框架使用实例 1 创建scrapy项目 scrap
  • C++基础入门

    文章目录 C 43 43 基础入门1 变量和常量2 关键字3 数据类型4 流程控制5 数组6 函数7 指针8 结构体 C 43 43 基础入门 1 变量和常量 变量和常量 变量 xff1a 数据类型 变量名 61 值 常量 xff1a 宏常
  • 解决CLion的 CMake executable not found:XXX

    解决CLion的 CMake executable not found XXX 问题 CLion不能编译DeepStream项目 xff0c 也不能 build 和 debug了 xff0c 还出现以下提示 xff1a 原因 原因是 cli
  • C++核心编程

    C 43 43 核心编程 1 c 43 43 内存模型 c 43 43 程序执行时将内存大致分为4个区域 代码区 xff1a 存放CPU执行的二进制代码指令 xff0c 由操作系统进行管理全局区 xff1a 存放全局变量和静态变量以及全局常
  • STL技术——STL概述和入门

    文章目录 STL技术 STL概述和入门1 STL简介2 入门案例2 1 vecto存放内置数据类型2 2 vecto存放自定义数据类型2 3 容器嵌套 STL技术 STL概述和入门 1 STL简介 STL介绍 STL xff08 stand
  • 使用keil软件添加.C文件和.H文件到工程

    使用keil软件添加 C文件和 H文件到工程 1 第一步 在所建工程的文件夹下的HARDWARE子文件夹下创建一个所要添加文件名称 xff0c 例如要添加led c和led h文件 xff0c 可以先在HARDWARE文件目录下创建一个命名
  • STL常用容器——String容器的使用

    文章目录 STL常用容器 String容器1 string构造器2 string的赋值操作3 拼接字符串4 字符串查找和替换5 字符串比较6 字符串存取7 字符串插入与删除8 截取字符串 STL常用容器 String容器 string类封装
  • STL常用容器——vector容器的使用

    文章目录 STL常用容器 vector容器的使用1 vector容器概念2 vector容器构造方式3 vector赋值操作4 vector容量 capacity 和大小 size 的区别5 vector添加和删除6 vector数据存取
  • STL常用容器——deque容器的使用

    文章目录 STL常用容器 deque容器的使用1 deque 容器简介2 deque容器的构造函数3 deque的赋值操作4 deque大小操作5 deque容器添加和删除元素6 deque容器访问元素7 容器内元素排序 STL常用容器 d
  • STL常用容器——stack容器的使用

    文章目录 STL常用容器 stack容器的使用1 stack容器介绍2 stack容器常用接口 STL常用容器 stack容器的使用 1 stack容器介绍 stack容器简介 stack容器是堆栈容器 xff0c 该容器具有先进后出的特性
  • STL常用容器——queue容器的使用

    文章目录 STL常用容器 queue容器的使用1 queue容器的介绍2 queue容器常用接口2 1 queue容器构造函数2 2 queue队列容器常用的成员函数 STL常用容器 queue容器的使用 1 queue容器的介绍 queu
  • STL常用容器—— list 容器的使用

    文章目录 STL常用容器 list 容器的使用1 list 容器介绍2 list容器的构造函数3 list容器的赋值和交换4 list容器大小操作5 list容器添加和删除元素操作6 list容器数据存取7 list容器反转和排序 STL常
  • STL常用容器——set容器的使用

    文章目录 STL常用容器 set容器的使用1 set容器简介2 set容器的构造和赋值3 set容器的大小和交换4 set容器的添加与删除5 set容器的查找与统计6 pair类模板7 set和multiset的区别8 set容器的排序 S
  • STL常用容器——map容器的使用

    文章目录 STL常用容器 map容器的使用1 map容器介绍2 map容器构造和赋值3 map容器大小和交换4 map容器的添加和删除4 1 insert插入数据的四种方式4 2 删除键值对 5 map容器查找和统计6 map容器排序 ST
  • STL常用算法——遍历算法

    文章目录 STL常用算法 遍历算法1 for each 2 transform STL常用算法 遍历算法 1 for each for each xff1a 遍历容器 xff0c 对容器中的每一个元素调用函数或函数对象 函数原型 xff1a
  • STL常用算法——查找算法

    文章目录 STL常用算法 查找算法1 find 2 find if 3 adjacent find 4 binary search 5 count 和count if 5 1 count 5 2 count if STL常用算法 查找算法
  • 视觉识别示例-海康威视

    视觉识别示例 海康威视 C Program Files x86 MVS Development Documentations1 在海康威视软件MVS xff0c 默认安装目录下有示例及说明 xff0c 如上图是示例说明 C Program
  • STL常用算法——排序算法

    文章目录 STL常用算法 排序算法1 sort 2 random shuffle 3 merge 4 reverse STL常用算法 排序算法 1 sort sort xff1a 对容器或普通数组中范围内的元素进行排序 xff0c 默认进行