“STL算法大全“

news2024/11/14 20:51:56

在这里插入图片描述

前言

欢迎来到💖小K💖的💞C++专栏💞,本小节是继非质变算法的第二篇C++STL算法,所以本节总结了大量的STL算法,以便大家需要时查阅

在这里插入图片描述

文章目录

      • 前言
      • 质变算法
      • 查找算法(13个)
      • 排序和通用算法(14个)
      • 删除和替换算法(15个)
      • 排列组合算法(2个)
      • 算术算法(4个)
      • 生成和异变算法(6个)
      • 关系算法(8个)
      • 集合算法(4个)
      • 堆算法(4个)


质变算法

算法会改变容器的数据

copy

将范围中的元素复制到从result[first,last)开始的范围中。 该函数返回一个指向目标范围末尾的迭代器(它指向复制的最后一个元素之后的元素)。范围不应以result指向范围[first,last)中的元素的 方式重叠。

copy_if

复制范围的某些元素满足条件的,将pred返回的范围内[first,last)的 元素复制到从result开始的范围。

copy_n

将范围 beginning in first的前n 个元素 复制到范围 beginning at result中。 该函数返回一个指向目标范围末尾的迭代器(指向最后一个复制元素之后的一个)。 如果n为负,则该函数不执行任何操作。如果范围重叠,则result 指向的范围中的某些元素可能具有未定义但有效的值。

copy_backward

向后复制范围内额元素(从右往左)。将范围[first,last]中的元素从end开始复制到以result结束的范围。
该函数返回指向目标范围内第一个元素的迭代器。结果范围的元素顺序与[first,last)完全相同。要反转它们的顺序,请参阅reverse_copy。就是从后面往前复制

测试案例及结果

void testCopy() 
{
	vector<int> vec(5);
	int num[] = { 2,4,5,7,9 };
	copy(num, num + 5, vec.begin());
	for (auto& v : vec)
	{
		cout << v << " ";
	}
	cout << endl;

	vector<int> vec1(5);
	copy_if(num, num + 5, vec1.begin(), [](int& n) {return n > 5; });
	for (auto& v : vec1)
	{
		cout << v << " ";
	}
	cout << endl;

	vector<int> vec2(5);
	copy_n(num, 3, vec2.begin());
	for (auto& v : vec2)
	{
		cout << v << " ";
	}
	cout << endl;

	vector<int> vec3(5);
	copy_backward(num, num + 5, vec3.end());
	for (auto& v : vec3)
	{
		cout << v << " ";
	}
	cout << endl;
}

在这里插入图片描述

move

将范围[first,last)中的元素移动到从结果开始的范围中。即实现了移动语义,如果容器里面存的对象有指针,则会移动,普通数据类型和copy一样

void test()
{
	vector<string> names = { "顽石","hello","world" };
	vector<string> foo(3);

	cout << "names contains " << endl;
	for (auto& str : names)cout <<"[" << str << "] ";
	cout << endl;
	cout << "foo contains " << endl;
	for (auto& str : foo)cout << "[" << str << "] ";
	cout <<"\n\n" << endl;

	cout << "Moving ranges..." << endl;
	move(names.begin(), names.end(), foo.begin());
	cout << "names contains " << endl;
	for (auto& str : names)cout << "[" << str << "] ";
	cout << endl;
	cout << "foo contains " << endl;
	for (auto& str : foo)cout << "[" << str << "] ";
	cout << endl;

	cout << "Moving Container" << endl;
	names = std::move(foo);

}

move_backward

向后移动范围内的元素

swap

交换两个对象的值

swap_ranges

交换两个范围的值

void test()
{
	vector<string> names = { "顽石","hello","world" };
	vector<string> foo(3);
	swap(names, foo);
	swap_ranges(foo.begin(), foo.end()-1, names.begin());
}

iter_swap

交换由两个迭代器指向的对象的值

transform

变换范围

replace

替换范围内的值

replace_if

替换范围内的值

replace_copy

Copy range replacing value (function template)

replace_copy_if

Copy range replacing value (function template)

fill

Fill range with value (function template)

fill_n

Fill sequence with value (function template)

generate

Generate values for range with function (function template)

generate_n

Generate values for sequence with function (function template)

remove

Remove value from range (function template)

remove_if

Remove elements from range (function template)

remove_copy

Copy range removing value (function template)

remove_copy_if

Copy range removing values (function template)

unique

Remove consecutive duplicates in range (function template)

unique_copy

Copy range removing duplicates (function template)

reverse

Reverse range (function template)

reverse_copy

Copy range reversed (function template)

rotate

Rotate left the elements in range (function template)

rotate_copy

Copy range rotated left (function template)

random_shuffle

Randomly rearrange elements in range (function template)

shuffle

Randomly rearrange elements in range using generator (function template)

STL中算法大致分为四类:

1、非可变序列算法:指不直接修改其所操作的容器内容的算法。

2、可变序列算法:指可以修改它们所操作的容器内容的算法。

3、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。

4、数值算法:对容器内容进行数值计算。 以下对所有算法进行细致分类并标明功能:

查找算法(13个)

判断容器中是否包含某个值

adjacent_find: 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。

binary_search: 在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。 count: 利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。

count_if: 利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。

equal_range: 功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。

find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator。

find_end: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。

find_first_of: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符。

find_if: 使用输入的函数代替等于操作符执行find。 lower_bound: 返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用自定义比较操作。

upper_bound: 返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值。重载函数使用自定义比较操作。

search: 给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1。重载版本使用自定义的比较操作。

search_n: 在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。

排序和通用算法(14个)

提供元素排序策略

inplace_merge: 合并两个有序序列,结果序列覆盖两端范围。重载版本使用输入的操作进行排序。

merge: 合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。

nth_element: 将范围内的序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。重载版本使用自定义的比较操作。

partial_sort: 对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作。

partial_sort_copy: 与partial_sort类似,不过将经过排序的序列复制到另一个容器。

partition: 对指定范围内元素重新排序,使用输入的函数,把结果为true的元素放在结果为false的元素之前。

random_shuffle: 对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作。

reverse: 将指定范围内元素重新反序排序。

reverse_copy: 与reverse类似,不过将结果写入另一个容器。

rotate: 将指定范围内元素移到容器末尾,由middle指向的元素成为容器第一个元素。

rotate_copy: 与rotate类似,不过将结果写入另一个容器。

sort: 以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作。

//该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如`std::greater<T>`降序排序规则),甚至还可以自定义排序规则。

//需要注意的是,sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:

//1. 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 <font style="color:red">array、vector、deque</font> 这 3 个容器提供支持。

//2. 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持`<`小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;

stable_sort: 与sort类似,不过保留相等元素之间的顺序关系。

stable_partition: 与partition类似,不过不保证保留容器中的相对顺序。

删除和替换算法(15个)

copy: 复制序列

copy_backward: 与copy相同,不过元素是以相反顺序被拷贝。

iter_swap: 交换两个ForwardIterator的值。

remove: 删除指定范围内所有等于指定元素的元素。注意,该函数不是真正删除函数。内置函数不适合使用remove和remove_if函数。

remove_copy: 将所有不匹配元素复制到一个制定容器,返回OutputIterator指向被拷贝的末元素的下一个位置。

remove_if: 删除指定范围内输入操作结果为true的所有元素。

remove_copy_if: 将所有不匹配元素拷贝到一个指定容器。

replace: 将指定范围内所有等于vold的元素都用vnew代替。

replace_copy: 与replace类似,不过将结果写入另一个容器。

replace_if: 将指定范围内所有操作结果为true的元素用新值代替。

replace_copy_if: 与replace_if,不过将结果写入另一个容器。

swap: 交换存储在两个对象中的值。

swap_range: 将指定范围内的元素与另一个序列元素值进行交换。

unique: 清除序列中重复元素,和remove类似,它也不能真正删除元素。重载版本使用自定义比较操作。

unique_copy: 与unique类似,不过把结果输出到另一个容器。

排列组合算法(2个)

提供计算给定集合按一定顺序的所有可能排列组合

next_permutation: 取出当前范围内的排列,并重新排序为下一个排列。重载版本使用自定义的比较操作。

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

算术算法(4个)

accumulate: iterator对标识的序列段元素之和,加到一个由val指定的初始值上。重载版本不再做加法,而是传进来的二元操作符被应用到元素上。

partial_sum: 创建一个新序列,其中每个元素值代表指定范围内该位置前所有元素之和。重载版本使用自定义操作代替加法。

inner_product: 对两个序列做内积(对应元素相乘,再求和)并将内积加到一个输入的初始值上。重载版本使用用户定义的操作。

adjacent_difference: 创建一个新序列,新序列中每个新值代表当前元素与上一个元素的差。重载版本用指定二元操作计算相邻元素的差。

生成和异变算法(6个)

fill: 将输入值赋给标志范围内的所有元素。

fill_n: 将输入值赋给first到first+n范围内的所有元素。

for_each: 用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素。

generate: 连续调用输入的函数来填充指定的范围。

generate_n: 与generate函数类似,填充从指定iterator开始的n个元素。

transform: 将输入的操作作用与指定范围内的每个元素,并产生一个新的序列。重载版本将操作作用在一对元素上,另外一个元素来自输入的另外一个序列。结果输出到指定容器。

关系算法(8个)

equal: 如果两个序列在标志范围内元素都相等,返回true。重载版本使用输入的操作符代替默认的等于操作符。

includes: 判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的<操作符,成功返回true。重载版本使用用户输入的函数。

lexicographical_compare: 比较两个序列。重载版本使用用户自定义比较操作。

max: 返回两个元素中较大一个。重载版本使用自定义比较操作。

max_element: 返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。

min: 返回两个元素中较小一个。重载版本使用自定义比较操作。

min_element: 返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。

mismatch: 并行比较两个序列,指出第一个不匹配的位置,返回一对iterator,标志第一个不匹配元素位置。如果都匹配,返回每个容器的last。重载版本使用自定义的比较操作。

集合算法(4个)

set_union: 构造一个有序序列,包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作。

set_intersection: 构造一个有序序列,其中元素在两个序列中都存在。重载版本使用自定义的比较操作。

set_difference: 构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。重载版本使用自定义的比较操作。

set_symmetric_difference: 构造一个有序序列,该序列取两个序列的对称差集(并集-交集)。

堆算法(4个)

make_heap: 把指定范围内的元素生成一个堆。重载版本使用自定义比较操作。

pop_heap: 并不真正把最大元素从堆中弹出,而是重新排序堆。它把first和last-1交换,然后重新生成一个堆。可使用容器的back来访问被"弹出"的元素或者使用pop_back进行真正的删除。重载版本使用自定义的比较操作。

push_heap: 假设first到last-1是一个有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。在指向该函数前,必须先把元素插入容器后。重载版本使用指定的比较操作。

sort_heap: 对指定范围内的序列重新排序,它假设该序列是个有序堆。重载版本使用自定义比较操作

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

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

相关文章

k8s nfs运行问题、etcd问题、calico网络问题

服务器重启后nfs运行问题导致服务不能正常重启 解决办法 在每个节点下使用如下命令进行查看nfs是否正常启动 systemctl status nfs 如果没有启动&#xff0c;则使用如下命令启动&#xff0c;保证三个节点下的nfs都正常启动 systemctl start nfs 再次查看nfs是否正常启动 syst…

你真的理解PyTorch中的dimension嘛?

文章目录 Understanding dimensions in PyTorch参考 Understanding dimensions in PyTorch 通过可视化3D张量上的求和过程&#xff0c;为PyTorch维度提供更好的直觉 当我们开始用PyTorch张量做一些基本的运算&#xff0c;比如求和时&#xff0c;对于一维张量来说&#xff0c;…

Mysql事务与存储引擎

目录 一、事务的概念二、事务的特点ACID2.1 原子性2.2 一致性2.3 隔离性2.4 持久性2.5 事务的互相影响 三、Mysql事务隔离级别3.1 查询全局事务隔离界别3.2 查询会话事务隔离级别3.3 设置全局事务隔离级别3.4 设置会话事务隔离级别 四、事务控制语句4.1 开始事务与提交4.2 事务…

不同问题来评测百度、谷歌、ChatGPT、Phind、GPT-4(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

ShardingSphere系列四(Sharding-JDBC内核原理及核心源码解析)

文章目录 1. ShardingSphere内核解析1.1 解析引擎1.2 路由引擎1.3 改写引擎1.4 执行引擎1.5 归并引擎 2. ShardingSphere的SPI扩展点2.1 SPI机制2.2 ShardingSphere中的SPI扩展点2.3 实现自定义主键生成策略 3. ShardingSphere源码 1. ShardingSphere内核解析 ShardingSphere虽…

css布局——flex布局知识点总结(青蛙游戏)

文章目录 学习网址推荐align-items、justify-content合并使用左右分布和垂直end flex-directionrowrow-reversecolumncolumn-reserse横向逆转并水平start垂直列并从末尾排列逆向垂直列并左右排列水平居中&#xff0c;垂直end&#xff0c;横向逆向 order、align-selforder改变排…

BOLD动态功能网络连接的时-频-空EEG模式

导读 目的&#xff1a;人们对大规模脑网络功能连接动力学研究的兴趣不断增长&#xff0c;同时也在努力寻找电生理相关。在EEG数据分析中&#xff0c;应用于空域和谱域的常用约束可能会使部分神经活动无法识别。本研究提出了一种与BOLD功能网络连接动态相关的多模态EEG频谱模式…

B. LuoTianyi and the Table

题目链接 Codeforces Round 872 (Div. 2) Example input 5 2 2 1 3 1 4 2 2 -1 -1 -1 -1 2 3 7 8 9 -3 10 8 3 2 4 8 -3 0 -7 1 4 3 -32030 59554 16854 -85927 68060 -64460 -79547 90932 85063 82703 -12001 38762 output 9 0 64 71 1933711 题目大意&#xff1a; 每组测试…

Java 远程debug,IDEA 远程 Debug 调试

有时候我们需要进行远程的debug&#xff0c;本文研究如何进行远程debug&#xff0c;以及使用 IDEA 远程debug的过程中的细节。看完可以解决你的一些疑惑。 配置 远程debug的服务&#xff0c;以SpringBoot微服务为例。 首先&#xff0c;启动SpringBoot需要加上特定的参数。 …

【JUC】浅析ConcurrentLinkedQueue

【JUC】浅析ConcurrentLinkedQueue 文章目录 【JUC】浅析ConcurrentLinkedQueue一、前言二、ConcurrentLinkedQueue的结构三、入队列3.1、入队列的过程3.2、定位尾节点3.3、设置入队节点为尾节点3.4、HOPS的设计意图 四、出队列 一、前言 在并发编程中&#xff0c;有时候需要使…

本文主要介绍在VMware虚拟机里面安装windows sever 2012 R2并且配置hyper-V的过程,此外还涵盖出现问题的解决方案。

系列文章目录 Windows xp 在VMware虚拟机上面安装的详细步骤_xp系统虚拟机 虚拟机VMware里面安装Windows sever 2003版本详细教程 Windows配置虚拟网络 文章目录 系列文章目录 前言 一、配置的前提条件 1.1、实验环境 1.2、资源分享 二、安装教程 2.1、新建windows …

不同设备如何统一语言编程平台高效开发?本文为你揭秘

原文&#xff1a;不同设备如何统一语言编程平台高效开发&#xff1f;本文为你揭秘&#xff0c;点击链接查看更多技术内容。 随着数字化时代的发展&#xff0c;手机、平板、PC、电视、智能手表、车机等智能设备的普及率越来越高&#xff0c;但不同设备往往搭载了不同的操作系统。…

Word控件Spire.Doc 【文本框】教程(1):如何在 C 语言中设置 Word 文本框的内部边距

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

改写中文句子的软件-修改文章句子的软件

免费语句改写软件 您是否在写博客、新闻稿或者其他需要大量文本的场合中觉得无从下手&#xff1f;您是否为修改一段语句上耗费大量时间感到困扰&#xff1f;如果您有这样的烦恼&#xff0c;那么我向您介绍我们的免费语句改写软件&#xff0c;可以帮助您快速批量语句改写&#x…

“AI代劳”,跨域赋能“智慧企业”

随着全球数字信息化的到来&#xff0c;各大新兴行业企业也逐渐意识到“智慧化”转型的重要性&#xff0c;但目前仍有不少企业在面临着人力成本高、运营管理效率低、营销获客效果差、数据分析能力薄弱等瓶颈&#xff0c;那么&#xff0c;处于这些瓶颈期的企业该如何实现“智慧化…

Vue-弹层显示样式

弹层显示样式1 1.先将左侧样式写 <template><div classhome-category><ul class"menu"><li v-for"i in 10" :key"i"><RouterLink to"/">居家</RouterLink><RouterLink to"/">洗…

pd电源测试-PD电源自动测试系统ATECLOUD-Power

PD电源测试是一种重要的电源测试方法&#xff0c;采用该方法可以更加全面、详细地评估各种电子产品和设备的性能和安全性。本文将阐述PD电源测试的基本原理、测试对象以及测试的应用价值。 首先&#xff0c;PD电源测试的基本原理是通过对电压、电流、功率等重要指标进行测试评…

无论是企业或个人,你知道数据泄露有多严重吗?

现代科技的发展使我们的隐私越来越容易受到侵犯&#xff0c;互联网、社交媒体和智能手机等技术使我们的信息变得更加易于访问和共享。此外商业公司和机构也积极收集和利用我们的个人数据&#xff0c;这些公司和机构可能利用我们的数据来推销产品和服务&#xff0c;或者在不经过…

励志长篇小说《周兴和》书连载之二饥饿寒冷童年

饥饿寒冷童年梦 兴和至今也记得&#xff0c;这年冬天特别冷。 那一天&#xff0c;放了学的小兴和背着书篼&#xff0c;又冷又饿地从毛公乡小学出来&#xff0c;艰难地爬上了回家的那条山道。他已一天没吃东西了&#xff0c;肚皮早就饿得贴着脊梁骨了。爬上一个小山坡&#xff…

(六)实现好友管理:教你如何在即时通信系统中添加好友

文章目录 一、引言1.1 即时通信系统中用户增加好友功能的重要性和应用场景1.2 TCP连接传输用户增加好友请求的基本原理 二、实现用户增加好友功能2.1 实现用户好友列表的展示和管理2.1.1 使用QListWidgetItem控件展示好友列表客户端关键代码展示服务端关键代码展示 三、效果展示…