C++ STL基础算法
文章平均质量分 79
C++ STL基础算法
双子座断点
不断学习提升自己,慢慢的通过博客将自己所学、所会、所用陆续分享给大家
展开
-
C++ 标准库 常用算法总结(排序、合并、搜索和分区)
本系列文章介绍了所有的STL常用的算法。这些算法通常都有不同的功能,例如:排序元素算法{sort()、stable_sort()、nth_element()}、 查询元素算法{find()、find_if()、find_if_not()、find_end()、find_first_of()、adjacent_find()}、 复制元素算法{copy()、strcpy()、strncpy()、memcpy()、copy_n()、copy_if()、copy_backward()}、 删除元素算法{rem原创 2023-01-31 02:29:01 · 2754 阅读 · 0 评论 -
C++ STL iterator迭代器(深入了解,一文学会)
无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iterator)”来实现。那么,迭代器到底是什么呢?我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的操作方法应该是类似的。既然类似,完全可以利用泛型技术,将它们设计成适用所有容器的通用算法,从而将容器和算法分离开。但实现此目的需...原创 2021-09-04 00:46:44 · 779 阅读 · 0 评论 -
C++ fill和fill_n函数用法详解(深入了解,一文学会)
将一个区间的元素都赋予val值。函数参数 :fill(vec.begin(), vec.end(), val);val为将要替换的值。fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值。本文作者原创,转载请附上文章出处与本文链接。...原创 2022-08-05 01:07:17 · 2014 阅读 · 0 评论 -
C++ swap_ranges()排序函数用法详解(深入了解,一文学会)
swap_ranges() 算法被用来交换 people 的前两个元素和 folks 的后两个元素。除了 pair 对象的重载之外,utility 文件头中也有可以交换任何类型的容器对象的模板的重载。也就是说,可以交换两个 list 容器或者两个 set 容器但不能是一个 list 和 vector,也不能是一个 list 和一个 list。这段代码会对 pair 对象进行交换,在前面的代码段中也可以用 swap_ranges() 来交换元素。...原创 2022-08-14 23:24:30 · 363 阅读 · 0 评论 -
C++ lexicographical_compare()字符串排序算法详解
如果字符串的长度相同,而且所有的字符都相等,那么这些字符串就相等。如果字符串的长度不同,短字符串的字符序列和长字符串的初始序列是相同的,那么短字符串小于长字符串。它的前两个参数定义了第一个序列,第 3 和第 4 个参数分别是第二个序列的开始和结束迭代器。如果序列的长度不同,而且短序列和长序列的初始元素序列匹配,那么短序列小于长序列。长度相同而且对应元素都相等的两个序列是相等的。从两个序列的第一个元素开始依次比较对应的元素,前两个对象的不同会决定序列的顺序。显然,序列中的对象必须是可比较的。原创 2022-09-05 22:21:40 · 315 阅读 · 0 评论 -
C++ merge()和inplace_merge()函数用法详解(深入了解,一文学会)
我们将 2 个有序序列合并为 1 个有序序列,这时就可以借助 merge() 或者 inplace_merge() 函数实现。本文作者原创,转载请附上文章出处与本文链接。原创 2022-08-05 01:04:33 · 5128 阅读 · 0 评论 -
C++ unique算法详解(深入了解,一文学会)
没有元素会从输入序列中移除;算法并没有方法去移除元素,因为它并不知道它们的具体上下文。但是,无法保证新末尾之后的元素的状态;unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。可以提供一个函数对象作为可选的第三个参数,这个参数会定义一个用来代替。相同个数的元素仍然存在,但新的结束迭代器指向的元素为空字符串;在你的系统上,可能会有不同的结果。这样会通过覆盖来消除 words 中的连续元素。原创 2022-09-08 01:17:32 · 539 阅读 · 0 评论 -
C++ copy()函数用法详解(深入了解,一文学会)
C++ 算法 copy() 函数用于将容器 [first,last] 的所有元素从结果开始复制到不同的容器中。本文介绍了copy、strcpy、strncpy、memcpy、copy_n、copy_if、copy_backward等使用方法和代码示例本文作者原创,转载请附上文章出处与本文链接。C++ copy()函数用法详解目录。...原创 2022-08-11 22:07:44 · 29237 阅读 · 1 评论 -
C++ partition()和stable_partition()函数用法详解(深入了解,一文学会)
partition 可直译为“分组”,partition() 函数可根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合筛选条件的数据,另一组为不符合筛选条件的数据。本文作者原创,转载请附上文章出处与本文链接。partition 可直译为“分组”,partition() 函数可根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合筛选条件的数据,另一组为不符合筛选条件的数据。...原创 2022-08-08 01:36:10 · 3394 阅读 · 0 评论 -
C++ STL begin()和end()函数(深入了解,一文学会)
C++ STL标准库提供的所有容器做了系统的讲解。无论是序列式容器还是关联式容器(包括哈希容器),不仅模板类内部提供有 begin() 和 end() 成员方法,C++ STL 标准库中还提供有同名且具有相同功能的begin() 和 end() 函数。首先需要说明的是,begin() 和 end() 是以函数模板的形式定义的,但它们的模板并没有位于某一个头文件中,而是很多头文件中都有它们的定义。C++ STL 标准库中,包含 begin() 和 end() 函数模板的头文件包括:...原创 2021-09-04 00:50:14 · 20319 阅读 · 1 评论 -
C++ search()函数用法详解(深入了解,一文学会)
find_end() 函数用于在序列 A 中查找序列 B 最后一次出现的位置。那么,如果想知道序列 B 在序列 A 中第一次出现的位置,该如何实现呢?可以借助 search() 函数。search() 函数定义在头文件中,其功能恰好和 find_end() 函数相反,用于在序列 A 中查找序列 B 第一次出现的位置。C++ search()函数用法详解(深入了解,一文学会)目录1 search()语法格式2 search() 示例2.1 第一种语法格式2.2 第二种语法格式 第二种语法自定义规原创 2022-09-01 01:11:35 · 7195 阅读 · 0 评论 -
C++ partial_sort()排序函数用法详解(深入了解,一文学会)
partial_sort()分为partial_sort()和partial_sort_copy()两种函数。partial_sort()排序函数主要用在非常大的容器筛选最大或者最小值来使用,例如:容器A有100万个元素,需要找出最大或者最小的10个元素,这时候就需要用到partial_sort()和partial_sort_copy()两种函数。partial_sort() 重新调整容器元素顺序,达到选出最大值或者最小值的目的;partial_sor......原创 2022-07-30 15:00:19 · 5183 阅读 · 0 评论 -
C++ generate和generate_n函数用法详解(深入了解,一文学会)
参数 容器遍历起始位置,容器遍历最后一个位置,特定的动作(函数)参数 容器遍历起始位置,容器遍历的个数,特定的动作(函数)作用 以指定动作运算结果填充特定范围内的元素内容。作用 以指定动作的运算结果填充n个元素内容。本文作者原创,转载请附上文章出处与本文链接。算法名称 generate_n。算法名称 generate。返回值 返回一个迭代器。返回值 void。...原创 2022-08-05 01:08:40 · 1402 阅读 · 0 评论 -
C++ remove()函数用法详解(深入了解,一文学会)
如果不知道具体的场景,即元素保存在什么样的容器中,是不能从序列中移除元素的。因此,“移除元素的”算法也无法做到这一点,它们只会重写被选择的元素或者忽略复制的元素。移除操作不会改变被“移除”元素的序列的元素个数。有 4 种移除算法:remove() 可以从它的前两个正向迭代器参数指定的序列中移除和第三个参数相等的对象。基本上每个元素都是通过用它后面的元素覆盖它来实现移除的。它会返回一个指向新的最后一个元素之后的位置的迭代器。remove_copy() 可以将前两个正向迭代器参数指定的序列中的元素复制到第三个原创 2022-08-04 01:34:12 · 9809 阅读 · 2 评论 -
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会)
在 advance() 和 distance() 函数各自的功能和用法基础上,继续讲解如何利用这 2 个函数实现将 const_iterator 迭代器转换为 iterator 迭代器,或者将 const_reverse_iterator 迭代器转换为 reverse_iterator 迭代器。注意,上面提到的 iterator、const_iterator、reverse_iterator 和 const_reverse_iterator 是 C++ STL 标准库提供了 4 种基础迭...原创 2021-09-04 00:48:13 · 1601 阅读 · 0 评论 -
C++ all_of、any_of及none_of排序算法详解(深入了解,一文学会)
algorithm 头文件中定义了 3 种算法,用来检查在算法应用到序列中的元素上时,什么时候使谓词返回 true。这些算法的前两个参数是定义谓词应用范围的输入迭代器;第三个参数指定了谓词。检查元素是否能让谓词返回 true 似乎很简单,但它却是十分有用的。例如,可以检查所有学生是否通过了考试,或者检查所有学生是否都参加了课程,或者检查有没有眼睛发绿的 Person 对象,甚至可以检查每个 Dog 对象是否度过了它自己的一天。谓词可以简单,也可以复杂,这取决于你。...原创 2022-09-01 01:09:24 · 603 阅读 · 0 评论 -
C++ STL advance()函数(深入了解,一文学会)
advance() 函数用于将迭代器前进(或者后退)指定长度的距离。template <class InputIterator, class Distance> void advance (InputIterator& it, Distance n);其中 it 指的是目标迭代器,n 通常为一个整数。需要注意的是,如果 it 为输入迭代器或者前向迭代器,则 n 必须为一个正数,即表示将 it 右移(前进) n 个位置;反之,如果 it 为双向迭代器或...原创 2021-09-04 00:43:29 · 6159 阅读 · 0 评论 -
C++ replace,replace_if和replace_copy函数用法详解(深入了解,一文学会)
可以在序列中有选择地替换元素的最后一个算法是 replace_copy_if(),它和 replace_if() 算法是相同的,但它的结果会被保存到另一个序列中。它的前两个参数是输入序列的迭代器,第 3 个参数是输出序列的开始迭代器,最后两个参数分别是谓词和替换值。它的前两个参数是输入序列的正向迭代器,第 3 个参数是输入序列的开始迭代器,最后两个参数分别是要被替换的值和替换值。它的前两个参数是被处理序列的正向迭代器,第 3 个参数是被替换的值,第 4 个参数是新的值。...原创 2022-08-08 01:31:05 · 1062 阅读 · 0 评论 -
C++ rotate()排序函数用法详解(深入了解,一文学会)
为了理解如何旋转序列,可以将序列中的元素想象成手镯上的珠子。rotate() 操作会导致一个新元素成为开始迭代器所指向的第一个元素。在旋转之后,最后一个元素会在新的第一个元素之前。rotate() 的第一个参数是这个序列的开始迭代器;第二个参数是指向新的第一个元素的迭代器,它必定在序列之内。第三个参数是这个序列的结束迭代器。图 1 中的示例说明在容器 ns 上的旋转操作使值为 4 的元素成为新的第一个元素,最后一个元素的值为 3。...原创 2022-08-08 01:32:56 · 3705 阅读 · 0 评论 -
C++ reverse()函数用法详解(深入了解,一文学会)
reverse_copy() 算法可以将源序列复制到目的序列中,目的序列中的元素是逆序的。定义源序列的前两个迭代器参数必须是双向迭代器。目的序列由第三个参数指定,它是目的序列的开始迭代器,也是一个输出迭代器。如果序列是重叠的,函数的行为是未定义的。这个算法会返回一个输出迭代器,它指向目的序列最后一个元素的下一个位置。本文作者原创,转载请附上文章出处与本文链接。原创 2022-09-08 01:06:13 · 26685 阅读 · 8 评论 -
C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)
find()、find_if()、search() 等。值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高。例如,当指定区域内的数据处于有序状态时,如果想查找某个目标元素,更推荐使用二分查找的方法(相比顺序查找,二分查找的执行效率更高)。C++ STL标准库中还提供有 lower_bound()、upper_bound()、equal_range() 以及 binary_search() 这 4 个查找函数,它们的底层实现采用的都是二分查找的方式。原创 2022-09-05 22:10:48 · 29591 阅读 · 7 评论 -
C++ STL distance()函数(深入了解,一文学会)
我们知道,作用于同一容器的 2 个同类型迭代器可以有效指定一个区间范围。在此基础上,如果想获取该指定范围内包含元素的个数,就可以借助distance()函数。distance() 函数用于计算两个迭代器表示的范围内包含元素的个数,其语法格式如下:template<class InputIterator> typename iterator_traits<InputIterator>::difference_type distance (InputIte...原创 2021-09-04 00:44:39 · 1789 阅读 · 0 评论 -
C++ move()排序函数用法详解(深入了解,一文学会)
move() 算法会将它的前两个输入迭代器参数指定的序列移到第三个参数定义的目的序列的开始位置,第三个参数必须是输出迭代器。这个算法返回的迭代器指向最后一个被移动到目的序列的元素的下一个位置。这是一个移动操作,因此无法保证在进行这个操作之后,输入序列仍然保持不变;源元素仍然会存在,但它们的值可能不再相同了,因此在移动之后,就不应该再使用它们。如果源序列可以被替换或破坏,就可以选择使用 move() 算法。如果不想扰乱源序列,可以使用 copy() 算法。本文作者原创,转载请附上文章出处与本文链接。原创 2022-09-05 22:16:50 · 2108 阅读 · 0 评论 -
C++ permutation排列算法详解(深入了解,一文学会)
排列就是一次对对象序列或值序列的重新排列。例如,“ABC”中字符可能的排列是:三个不同的字符有 6 种排列,这个数字是从 3*2*1 得到的。一般来说,n 个不同的字 符有 n!种排列,n!是 nx(n_1)x(n-2)...x2x1。很容易明白为什么要这样算。有 n 个对象 时,在序列的第一个位置就有 n 种可能的选择。对于第一个对象的每一种选择,序列的第 二个位置还剩下 n-1 种选择,因此前两个有 nx((n-1) 种可能选择。原创 2022-09-13 02:13:46 · 2345 阅读 · 1 评论 -
C++ mismatch(STL mismatch)算法详解
可以用和比较字符串类似的方式来比较序列。如果两个序列的长度相同,并且对应元素都相等,equal() 算法会返回 true。有 4 个版本的 equal() 算法,其中两个用 == 运算符来比较元素,另外两个用我们提供的作为参数的函数对象来比较元素,所有指定序列的迭代器都必须至少是输入迭代器。用 == 运算符来比较两个序列的第一个版本期望 3 个输入迭代器参数,前两个参数是第一个序列的开始和结束迭代器,第三个参数是第二个序列的开始迭代器。如果第二个序列中包含的元素少于第一个序列,结果是未定义的。原创 2022-09-05 22:14:22 · 647 阅读 · 0 评论 -
C++ STL prev()和next()函数(深入了解,一文学会)
《C++ STL advance()函数(深入了解,一文学会)》一节中,详细讲解了 advance() 函数的功能,其可以将指定迭代器前移或后移 n 个位置的距离。1 advance() 函数移动的是源迭代器但值得一提的是,advance() 函数移动的是源迭代器,举个例子:#include <iostream> // std::cout#include <iterator> // std::advance#include <...原创 2021-09-04 00:52:11 · 7468 阅读 · 1 评论 -
C++ sort()排序函数用法详解(深入了解,一文学会)
C++ STL 标准库提供有很多实用的排序函数,如表 1 所示。通过调用它们,我们可以很轻松地实现对普通数组或者容器中指定范围内的元素进行排序。stable_sort() 函数完全可以看作是 sort() 函数在功能方面的升级版。换句话说,stable_sort() 和 sort() 具有相同的使用场景,就连语法格式也是相同的(后续会讲),只不过前者在功能上除了可以实现排序,还可以保证不改变相等元素的相对位置。只有普通数组和符合以下全部条件的容器,才能使用使用 nth_element() 函数:原创 2022-07-30 14:57:11 · 5836 阅读 · 0 评论 -
C++ is_sorted()排序函数用法详解(深入了解,一文学会)
find_end() 函数定义在<algorithm>头文件中,常用于在序列 A 中查找序列 B 最后一次出现的位置。例如,有如下 2 个序列:序列 A:1,2,3,4,5,1,2,3,4,5序列 B:1,2,3通过观察不难发现,序列 B 在序列 A 中出现了 2 次,而借助 find_end() 函数,可以轻松的得到序列 A 中最后一个(也就是第 2 个) {1,2,3}。......原创 2022-08-01 00:41:15 · 3892 阅读 · 0 评论 -
C++ search_n()函数用法详解(深入了解,一文学会)
和 search() 一样,search_n() 函数也定义在头文件中,用于在指定区域内查找第一个符合要求的子序列。不同之处在于,前者查找的子序列中可包含多个不同的元素,而后者查找的只能是包含多个相同元素的子序列。本文作者原创,转载请附上文章出处与本文链接。转载 2022-09-13 02:11:35 · 654 阅读 · 0 评论 -
C++ find()排序函数用法详解(深入了解,一文学会)
注意,find_end() 函数的第一种语法格式,其底层是借助 == 运算符实现的。这意味着,如果 [first1, last1] 和 [first2, last2] 区域内的元素为自定义的类对象或结构体变量时,使用该函数之前需要对 == 运算符进行重载。匹配{1,2,3}的起始位置为:7,*it = 1。匹配{2,3,4}的起始位置为:4,*it = 8。5 find_first_of() 函数。3 find_if_not() 函数。2 find_if() 函数。4 find_end()函数。原创 2022-09-28 01:51:15 · 1726 阅读 · 0 评论