C++ STL常见算法

news2024/12/23 14:38:55

目录

1 各种常见算法的用法

1.1 非可变序列算法

1.2 可变序列算法

1.3 Partitions

1.4 排序算法

1.5 查找算法

1.6 集合算法

1.7 堆算法

1.8 最大最小值算法

1.9 其他算法







1 各种常见算法的用法

STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象

STL中算法大致分为四类:

  • 1、非可变序列算法:指不直接修改其所操作的容器内容的算法。
  • 2、可变序列算法:指可以修改它们所操作的容器内容的算法。
  • 3、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
  • 4、数值算法:对容器内容进行数值计算。

1.1 非可变序列算法

all_ofall_of() 算法会返回 true,前提是序列中的所有元素都可以使谓词返回 true
any_ofany_of() 算法会返回 true,前提是序列中的任意一个元素都可以使谓词返回 true
none_ofnone_of() 算法会返回 true,前提是序列中没有元素可以使谓词返回 true
for_eachfor_each算法用于遍历容器中的元素
findfind() 函数本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。
find_if和 find() 函数相同,find_if() 函数也用于在指定区域内执行查找操作。不同的是,前者需要明确指定要查找的元素的值,而后者则允许自定义查找规则。
find_if_notfind_if_not() 函数和 find_if() 函数的功能恰好相反,通过上面的学习我们知道,find_if() 函数用于查找符合谓词函数规则的第一个元素,而 find_if_not() 函数则用于查找第一个不符合谓词函数规则的元素。
find_endfind_end() 函数定义在<algorithm>头文件中,常用于在序列 A 中查找序列 B 最后一次出现的位置。
find_first_offind_first_of() 函数用于在 [first1, last1) 范围内查找和 [first2, last2) 中任何元素相匹配的第一个元素。如果匹配成功,该函数会返回一个指向该元素的输入迭代器;反之,则返回一个和 last1 迭代器指向相同的输入迭代器。
adjacent_find

adjacent_find() 函数用于在指定范围内查找 2 个连续相等的元素。

count利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。
count_if利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。
mismatchequal() 算法可以告诉我们两个序列是否匹配。mismatch() 算法也可以告诉我们两个序列是否匹配,而且如果不匹配,它还能告诉我们不匹配的位置。
equal可以用和比较字符串类似的方式来比较序列。如果两个序列的长度相同,并且对应元素都相等,equal() 算法会返回 true。
is_permutationis_permutation() 算法可以用来检查一个序列是不是另一个序列的排列,如果是,会返回 true。
searchsearch() 函数定义在<algorithm>头文件中,其功能恰好和 find_end() 函数相反,用于在序列 A 中查找序列 B 第一次出现的位置。
search_n和 search() 一样,search_n() 函数也定义在<algorithm>头文件中,用于在指定区域内查找第一个符合要求的子序列。不同之处在于,前者查找的子序列中可包含多个不同的元素,而后者查找的只能是包含多个相同元素的子序列。

1.2 可变序列算法

copy复制序列
copy_ncopy_n() 算法可以从源容器复制指定个数的元素到目的容器中
copy_ifcopy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器
copy_backward它只会像 copy() 那样复制元素,但是从最后一个元素开始直到第一个元素。
movemove() 算法会将它的前两个输入迭代器参数指定的序列移到第三个参数定义的目的序列的开始位置,第三个参数必须是输出迭代器。这个算法返回的迭代器指向最后一个被移动到目的序列的元素的下一个位置。
move_backward该函数用于按向后顺序移动元素,它接受三个参数,然后移动属于范围[first,last)的元素。元素的移动以相反的顺序开始,终止点为“结果”。
swapswap():交换两个元素。
swap_rangesswap_ranges():交换指定范围的元素。
iter_swapiter_swap():交换由迭代器所指的两个元素。
transformtransform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。
replacereplace() 算法会用新的值来替换和给定值相匹配的元素。
replace_ifreplace_if() 会将使谓词返回 true 的元素替换为新的值。
replace_copyreplace_copy() 算法和 replace() 做的事是一样的,但它的结果会被保存到另一个序列中,而不会改变原始序列。
replace_copy_if可以在序列中有选择地替换元素的最后一个算法是 replace_copy_if(),它和 replace_if() 算法是相同的,但它的结果会被保存到另一个序列中。
fillfill() 和 fill_n() 算法提供了一种为元素序列填入给定值的简单方式,fill() 会填充整个序列;
fill_nfill_n() 则以给定的迭代器为起始位置,为指定个数的元素设置值。
generategenerate() 算法只会保存函数为序列中每个元素所返回的值,而且 genemte() 没有任何返回值。
generate_ngenerate_n() 和 generate() 的工作方式是相似的。不同之处是,它的第一个参数仍然是序列的开始迭代器,第二个参数是由第三个参数设置的元素的个数。
removeremove() 可以从它的前两个正向迭代器参数指定的序列中移除和第三个参数相等的对象。基本上每个元素都是通过用它后面的元素覆盖它来实现移除的。它会返回一个指向新的最后一个元素之后的位置的迭代器。
remove_ifremove_if() 可以从前两个正向迭代器指定的序列中移除能够使作为第三个参数的谓词返回 true 的元素。
remove_copyremove_copy() 可以将前两个正向迭代器参数指定的序列中的元素复制到第三个参数指定的目的序列中,并忽略和第 4 个参数相等的元素。它返回一个指向最后一个被复制到目的序列的元素的后一个位置的迭代器。序列不能是重叠的。
remove_copy_ifremove_copy_if() 可以将前两个正向迭代器参数指定的序列中,能够使作为第 4 个参数的谓词返回 true 的元素,复制到第三个参数指定的目的序列中。它返回一个指向最后一个被复制到目的序列的元素的后一个位置的迭代器。序列不能是重叠的。
uniqueunique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。
unique_copyCopy range removing duplicates (function template)
reversereverse() 算法可以在原地逆序它的两个双向迭代器参数所指定序列的元素。
reverse_copyreverse_copy() 算法可以将源序列复制到目的序列中,目的序列中的元素是逆序的。
rotaterotate() 算法会从左边选择序列的元素。
rotate_copyrotate_copy() 算法会在新序列中生成一个序列的旋转副本,并保持原序列不变。
random_shuffle函数random_shuffle()用来对一个元素序列进行随机排序。
shufflestd::shuffle()可以看做是std::random_shuffle的升级版。

1.3 分组算法

is_partitioned判断一个序列是否被划分为了两个部分,其中一部分满足指定条件,另一部分则不满足。
partitionpartition 可直译为“分组”,partition() 函数可根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合筛选条件的数据,另一组为不符合筛选条件的数据。
stable_partitionpartition() 函数只负责对指定区域内的数据进行分组,并不保证各组中元素的相对位置不发生改变。而如果想在分组的同时保证不改变各组中元素的相对位置,可以使用 stable_partition() 函数。
也就是说,stable_partition() 函数可以保证对指定区域内数据完成分组的同时,不改变各组内元素的相对位置。
partition_copy和 stable_partition() 一样,partition_copy() 函数也能按照某个筛选规则对指定区域内的数据进行“分组”,并且分组后不会改变各个元素的相对位置。更重要的是,partition_copy() 函数不会对原序列做修改,而是以复制的方式将序列中各个元组“分组”到其它的指定位置存储。
partition_point对于如何在已分好组的数据中找到分界位置,C++ 11标准库提供了专门解决此问题的函数,即 partition_point() 函数。

1.4 排序算法

sort对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。
stable_sort和 sort() 函数功能相似,不同之处在于,对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。
partial_sort从 [first,last) 范围内,筛选出 muddle-first 个最小的元素并排序存放在 [first,middle) 区间中。
partial_sort_copy从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。
is_sorted检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。
is_sorted_until (first, last)和 is_sorted() 函数功能类似,唯一的区别在于,如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。
void nth_element (first, nth, last)找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。

1.5 查找算法

lower_boundlower_bound() 函数用于在指定区域内查找不小于目标值的第一个元素。也就是说,使用该函数在指定范围内查找某个目标值时,最终查找到的不一定是和目标值相等的元素,还可能是比目标值大的元素。
upper_boundupper_bound() 函数定义在<algorithm>头文件中,用于在指定范围内查找大于目标值的第一个元素。
equal_rangeequel_range() 函数定义在<algorithm>头文件中,用于在指定范围内查找等于目标值的所有元素。
binary_searchbinary_search() 函数定义在<algorithm>头文件中,用于查找指定区域内是否包含某个目标元素。

1.6 集合算法

mergemerge() 函数用于将 2 个有序序列合并为 1 个有序序列,前提是这 2 个有序序列的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序序列,其排序规则也和这 2 个有序序列相同。
inplace_merge当 2 个有序序列存储在同一个数组或容器中时,如果想将它们合并为 1 个有序序列,除了使用 merge() 函数,更推荐使用 inplace_merge() 函数。
includesincludes() 算法可以比较两个元素的集合,如果第一个集合中的全部元素都来自第二个集合,它会返回 true。如果第二个集合是空的集合,它也返回 true。
set_union将两个容器的并集存储至新容器,并返回并集中最后1个元素的迭代器位置
set_intersection将两个容器的交集存储至新容器,并返回交集中最后1个元素的迭代器位置
set_difference将两个容器的差集存储至新容器,并返回差集中最后1个元素的迭代器位置
set_symmetric_difference计算两个集合的对称差

1.7 堆算法

push_heap将新元素插入到堆中
pop_heap在已有的堆结构中,删除堆顶元素
make_heap 将已有的数据排序,按照堆存储的要求
sort_heap堆排序,对一个堆结构进行排序。注意,如果没有待排序的数据不是按照堆的形式排序,则会排序失败。
is_heap判断一个数据队列是否为堆
is_heap_until判断一个数据队列是否为堆,同时返回第一个不满足堆结构的数据的迭代器

1.8 关系算法(最大最小值算法)

min返回两个元素中较小一个。重载版本使用自定义比较操作。
max返回两个元素中较大一个。重载版本使用自定义比较操作。
minmaxReturn smallest and largest elements (function template)
min_element返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。
max_element返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。
minmax_element

minmax_element()返回第一个最小元素和最后一个最大元素.

1.9 其他算法

lexicographical_compare比较两个序列。重载版本使用用户自定义比较操作。
next_permutation取出当前范围内的排列,并重新排序为下一个排列。重载版本使用自定义的比较操作
prev_permutation取出指定范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回false。重载版本使用自定义的比较操作。

容器特有的算法:

list容器上的迭代器是双向的,而不是随机访问类型因此,在此容器上不能使用需要随机访问迭代器的算法。这些算法包括sort及其相关的算法。还有一些其他的泛型算法,如合并,删除,反向和唯一,虽然可以用在列上,但却付出了性能上的代价。如果这些算法利用列表容器实现的特点,则可以更高效地执行。

标准库为list容器定义了更精细的操作集合,使它不必只依赖于泛型操作。

lst.remove_if(func):remove()的_if版本,删除使用func返回真的元素。

参考资料:

https://cplusplus.com/reference/algorithm/

C++ sort()排序函数用法详解

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

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

相关文章

uniapp 获取状态栏及小程序右侧胶囊信息(用于设置全屏小程序)

1.获取信息: //获取状态栏高度(px) this.statusBarHeight uni.getSystemInfoSync().statusBarHeight; //获取小程序胶囊信息 this.menuButtonInfo uni.getMenuButtonBoundingClientRect() 如下: 2.动态设置style样式: <view:style"{ paddingTop: menuButtonIn…

Oracle-RAC集群安装root.sh报错问题

问题背景: 在redhat 7.8上安装Oracle11G RAC集群&#xff0c;在节点一执行root.sh脚本时发生错误Disk Group OCRDG creation failed with the following message:ORA-15018: diskgroup cannot be created 问题分析: 从报错信息来看错误是在执行创建OCRDG磁盘组时失败&#xff0…

Python读取指定的TXT文本文件并从中提取指定数据的方法

本文介绍基于Python语言&#xff0c;遍历文件夹并从中找到文件名称符合我们需求的多个.txt格式文本文件&#xff0c;并从上述每一个文本文件中&#xff0c;找到我们需要的指定数据&#xff0c;最后得到所有文本文件中我们需要的数据的合集的方法。 首先&#xff0c;我们来明确一…

进度网络图详解

关键路径&#xff1a;总工期最长的那一条路径&#xff1a;可能不止一条。&#xff08;1条或多条&#xff09; 虚工作&#xff1a;不占用任何时间和资源的&#xff0c;只是为了让逻辑关系更加明确&#xff0c;网络图更加美观。 最早开始时间&#xff08;ES&#xff09;- 左上 最…

BT 种子,磁力链接是个啥?

[科普向] BT 种子、磁力链接到底是什么&#xff1f; BitTorrent 我们平时所说的 BT 种子&#xff0c;实际上指的是由 BitTorrent 协议所生成的一个包含资源信息的文件。与传统的网络传输协议不同&#xff0c;BitTorrent 协议是一种以 Peer-To-Peer&#xff08;P2P&#xff09…

【KingbaseES】查看表空间大小

查询单表空间大小 SELECT sys_size_pretty(sys_tablespace_size(sys_default))查看所有表空间大小&#xff08;不包含系统表空间&#xff0c;包含默认表空间&#xff09; SELECT oid,spcname AS "Name",sys_size_pretty(sys_tablespace_size(spcname)) AS "Lo…

2. SpringBoot快速回顾(@value读取配置文件)

目录 1.定义配置文件2. 定义Controller类3. 测试4. 优化4.1 封装实体类4.3 定义controller类4.2 测试 本文将介绍如何使用value读取配置文件的内容。 在实际项目中&#xff0c;往往会在配置文件中写项目部署需要配置的环境信息&#xff08;数据库驱动&#xff0c;数据库账号密码…

mysql离线安装

MySQL离线安装 进行MySQL离线安装包,当前安装版本为MySQL8.0.32 下载页面&#xff1a;https://downloads.mysql.com/archives/community/ 下载地址&#xff1a;https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.36-1.el7.x86_64.rpm-bundle.tar 将下载完成的安…

【Linux】关于Linux系统挂载大于2TB磁盘的问题

之前在Linux系统挂载文件系统的时候&#xff0c;我已经习惯了使用 fdisk 命令来对磁盘进行分区。fdisk 常用的几个指令有&#xff1a; m 显示命令帮助菜单&#xff1b; n 创建新的分区&#xff1b; p 显示分区信息&#xff1b; t 修改分区类型&#xff08;一般设置为8e&…

Transformer原理理解

本文介绍Transformer的基本原理&#xff0c;主要记录一下自己的学习过程。 论文&#xff1a;https://arxiv.org/abs/1706.03762 参考&#xff1a; http://jalammar.github.io/illustrated-transformer/https://zhuanlan.zhihu.com/p/338817680https://blog.csdn.net/longxin…

2023年05月份青少年软件编程Python等级考试试卷三级真题(含答案)

2023-05 Python三级真题 题数&#xff1a;38 分数&#xff1a;100 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 请选择&#xff0c;下面代码运行之后的结果是&#xff1f;&#xff08; &#xff09;&#xff08;2分&#xff09; a 2 b 4 try:…

声网 Agora音视频uniapp插件跑通详解

一、前言 在使用声网SDK做音视频会议开发时, 通过声网官方论坛 了解到,声网是提供uniapp插件的,只是在官方文档中不是很容易找到。 插件地址如下: Agora音视频插件 Agora音视频插件(JS) 本文讲解如何跑通演示示例 二、跑通Demo 2.1 环境安装: 参考: 2. 通过vue-…

Mellanox ConnectX-6-dx智能网卡 openvswitch 流表卸载源码分析

Mellanox ConnectX-6-dx智能网卡 具备流表卸载能力。智能网卡的部署方式兼容当前服务器ovs部署方式。而DPU bluefield 2&#xff0c;其要求ovs从服务器上转移到DPU上&#xff0c;这影响现有上层neutron架构&#xff0c;改造量大。 前置信息 OFED代码版本&#xff1a;Linux In…

Scratch 猴子踢球

scratch 猴子踢球 本程序转为HTML后运行&#xff0c;“猴子”角色跟随鼠标移动&#xff0c;“沙滩球”角色开始时生成20个并移动到随机位置&#xff0c;在碰到“猴子”角色时开始移动&#xff0c;碰到边缘或其它角色时反弹。 图形化程序如下 “沙滩球”角色 “猴子”角色

spring 详解四 IOC(spring Bean生命周期)

spring生命周期概述 spring Bean的生命周期是从Bean实例化之后&#xff0c;即通过反射创建对象之后&#xff0c;到Bean成为一个完整对象&#xff0c;最终存储在单例池中&#xff0c;然后在销毁的过程被称为spring Bean的生命周期&#xff0c;这部分不会介绍销毁过程&#xff0…

Spring限流之限流方案分析

文章目录 1 限流方案1.1 引言1.2 常用限流策略1.3 基于guava限流实现1.3.1 引入guava依赖1.3.2 自定义限流注解1.3.3 限流AOP类1.3.4 测试接口 1.4 基于sentinel限流实现1.4.1 引入sentinel核心依赖包1.4.2 自定义限流注解1.4.3 自定义AOP类实现限流1.4.4 自定义测试接口 1.5 基…

独立和相关(线性)的关系

相关(线性)>不独立 不相关(线性) 推不出 独立 (是因为不一定线性相关,可以沿曲线相关)

一起学SF框架系列5.7-模块Beans-BeanDefinition解析

开发人员按元数据规则定义了应用bean&#xff0c;了解SF如何根据定义解析成BeanDefiniton有助于深入理解框架实现。解析过程如下&#xff1a; 资源加载 从资源文件加载bean的元数据配置&#xff0c;实际过程如下图&#xff1a; 实际从指定的XML文件加载bean定义是从XmlBeanD…

电脑pdf如何转换成word格式?分享这三个方法给大家!

记灵在线工具是一个非常方便的PDF转Word工具&#xff0c;它可以帮助用户快速、准确地将PDF文件转换为Word格式。以下是使用步骤&#xff1a; 打开您的网络浏览器&#xff0c;访问记灵在线工具的官方网站。 在首页上找到并点击“PDF转Word”选项。 在新打开的页面中&#xff0…

如何在 SwiftUI 中配置 SwiftData

文章目录 前言创建模型模式和版本控制迈出关键的一步创建迁移计划创建模型容器从视图中查询模型从视图中访问模型上下文总结 前言 在 WWDC 2023 上&#xff0c;Apple 宣布了一个备受期待的新持久性刷新&#xff0c;以一种新的框架形式出现&#xff1a;SwiftData。SwiftData 从…