STL 算法
文章平均质量分 54
JIWilliams
这个作者很懒,什么都没留下…
展开
-
STL copy_backward复制算法
不要被 copy_backward() 算法的名称所误导,它不会逆转元素的顺序。它只会像 copy() 那样复制元素,但是从最后一个元素开始直到第一个元素。copy_backward() 会复制前两个迭代器参数指定的序列。第三个参数是目的序列的结束迭代器,通过将源序列中的最后一个元素复制到目的序列的结束迭代器之前,源序列会被复制到目的序列中,如图 1 所示。copy_backward() 的 ...原创 2018-12-19 14:06:54 · 296 阅读 · 0 评论 -
STL find_if查找算法
find_if() 同 find() 一样,为在输入迭代器所定义的范围内查找单个对象的算法,它可以在前两个参数指定的范围内查找可以使第三个参数指定的谓词返回 true 的第一个对象。谓词不能修改传给它的对象。find_if() 会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个 序列的结束迭代器。可以按如下方式使用 find_if() 来查找 numbers 中第一个大于 va...原创 2018-12-10 17:02:24 · 458 阅读 · 0 评论 -
STL find_if_not查找算法
find_if_not() 可以在输入迭代器所定义的范围内查找单个对象,该算法会在前两个参数指定的范围内查找可以使第三个参数指定的谓词 返回 false 的第一个对象。谓词不能修改传给它的对象。find_if_not() 会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个序列的结束迭代器。可以按如下方式用 find_if_not() 算法来查找使谓词为 false 的元素:v...原创 2018-12-10 17:16:09 · 202 阅读 · 0 评论 -
STL find_first_of查找算法
find_first_of() 算法可以在第一个序列中搜索第二个序列在第一个序列中第一次出现的任何元序列被搜索的范围由输入迭代器指定,但用于确定搜索序列的迭代器至少是正向迭代器。用 == 运算符来比较这两个序列中的元素,所以如果序列中是类类型的对象,这个类必须实现 operator==()。下面是一个使用 find_first_of() 的示例:string text {"The world...原创 2018-12-11 09:28:27 · 1399 阅读 · 0 评论 -
STL adjacent_find查找算法
adjacent_find() 算法可以用来搜索序列中两个连续相等的元素。用 == 运算符来比较连续的一对元素,返回的迭代器指向前两个相等元素中的第一个。如果没有一对相等的元素,这个算法返回这个序列的结束迭代器。例如:string saying {"Children should be seen and not heard."};auto iter = std::adjacent_find...原创 2018-12-11 09:11:55 · 350 阅读 · 0 评论 -
STL find_end查找算法
find_end() 会在一个序列中查找最后一个和另一个元素段匹配的匹配项,也可以看作在一个元素序列中查找子序列的最后一个匹配项。这个算法会返回一个指向子序列的最后一个匹配项的第一个元素的迭代器,或是一个指向这个序列的结束迭代器。下面是一个示例:string text {"Smith, where Jones had had \"had\", had had \"had had\"." " ...原创 2018-12-11 09:28:08 · 439 阅读 · 0 评论 -
STL search搜索算法
在查找序列的子序列方面,search() 算法和 find_end() 算法相似,但它所查找的是第一个匹配项而不是最后一个。和 find_end() 算法一样,它也有两个版本,第二个版本接受用来比较元素的谓词作为第 5 个参数。可以用 search() 来验证前面使用 find_end() 搜索的结果。 如何改变每次遍历搜索的具体范围是它们的主要不同之处。下面是一个示例:string t...原创 2018-12-11 09:44:23 · 950 阅读 · 1 评论 -
STL search_n搜索算法
search_n() 算法会搜索给定元素的匹配项,它在序列中连续出现了给定的次数。它的前两个参数是定义搜索范围的正向迭代器,第 3 个参数是想要查找的第 4 个元素的连续匹配次数。例如:std::vector<double> values {2.7, 2.7, 2.7, 3.14, 3.14, 3.14, 2.7, 2.7};double value {3.14};int t...原创 2018-12-12 09:23:23 · 391 阅读 · 0 评论 -
STL partition分割算法
在序列中分区元素会重新对元素进行排列,所有使给定谓词返回 true 的元素会被放在所有使谓词返回 false 的元素的前面。这就是 partition() 算法所做的事。partition 的前两个参数是定义被分区序列范围的正向迭代器,第三个参数是一个谓词。下面展示如何使用 partition() 来重新排列序列中的值,所有小于平均值的元素会被放在所有大于平均值的元素的前面:std::v...原创 2018-12-12 09:44:10 · 809 阅读 · 0 评论 -
STL partition_copy分割算法
partition_copy() 算法以和 stable_partition() 相同的方式对序列进行分区,但那些使谓词返回 true 的元素会被复制到一个单独的序列中,使谓词返回 false 的那些元素会被复制到第三个序列中。这个操作不会改变原始序列。原始序列由前两个参数指定,它们必须是输入迭代器。第 3 个参数用来确定目的序列的开始位置,它会保存那些使谓词返回 true 的元素。第 4 个...原创 2018-12-12 09:52:02 · 303 阅读 · 0 评论 -
STL partition_point分割算法
可以用 partition_point() 算法来获取分区序列中第一个分区的结束迭代器,它的前两个参数定义检查范围的正向迭代器,最后一个参数是用来对序列进行分区的谓词。我们通常不知道每个分区中元素的个数,这个算法使我们能够访问和提取这些分区中的元素。例如:std::vector<double> temperatures {65, 75, 56, 48, 31, 28, 32, 2...原创 2018-12-12 10:15:21 · 438 阅读 · 0 评论 -
STL binary_search二分查找算法
前面讲到的搜索算法都是对序列进行顺序搜索,而且没有事先对元素进行排序的要求。二分查找一般比顺序搜索要快,但要求序列中的元素是有序的。这主要是因为二分查找的搜索机制,图 1 说明了这种机制。图1 二分查找图 1 展示了在一个升序序列中二分查找 22 的过程。因为元素是升序排列的,所以查找机制使用小于运算符来查找元素。搜索降序序列需要使用小于运算符来比较元素。二分查找总是选择从序列中部的元素...原创 2018-12-12 11:00:09 · 567 阅读 · 0 评论 -
STL copy_n复制算法
copy_n() 算法可以从源容器复制指定个数的元素到目的容器中。第一个参数是指向第一个源元素的输入迭代器,第二个参数是需要复制的元素的个数,第三个参数是指向目的容器的第一个位置的迭代器。这个算法会返回一个指向最后一个被复制元素的后一个位置的迭代器,或者只是第三个参数——输出迭代器——如果第二个参数为 0。下面是一个使用它的示例:#include <unordered_set>...原创 2018-12-19 11:28:08 · 383 阅读 · 0 评论 -
STL copy_if复制算法
copy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器。前两个参数定义源序列的输入迭代器,第三个参数是指向目的序列的第一个位置的输出迭代器,第 4 个参数是一个谓词。会返回一个输出迭代器,它指向最后一个被复制元素的下一个位置。下面是一个使用 copy_if() 的示例:std::vector<string> names {"A1", "B...原创 2018-12-19 11:50:29 · 700 阅读 · 0 评论 -
STL rotate旋转算法
rotate() 算法会从左边选择序列的元素。它的工作机制如图 1 所示。图1 rotate()算法的工作方式为了理解如何旋转序列,可以将序列中的元素想象成手镯上的珠子。rotate() 操作会导致一个新元素成为开始迭代器所指向的第一个元素。在旋转之后,最后一个元素会在新的第一个元素之前。rotate() 的第一个参数是这个序列的开始迭代器;第二个参数是指向新的第一个元素的迭代器,它必定在...原创 2018-12-25 09:00:29 · 1093 阅读 · 0 评论 -
STL rotate_copy旋转算法
rotate_copy() 算法会在新序列中生成一个序列的旋转副本,并保持原序列不变。rotate_copy() 的前 3 个参数和 copy() 是相同的;第 4 个参数是一个输出迭代器,它指向目的序列的第一个元素。这个算法会返回一个目的序列的输出迭代器,它指向最后一个被复制元素的下一个位置。例如:std::vector<string> words {"one", "two",...原创 2018-12-25 09:06:57 · 282 阅读 · 0 评论 -
STL move移动算法
move() 算法会将它的前两个输入迭代器参数指定的序列移到第三个参数定义的目的序列的开始位置,第三个参数必须是输出迭代器。这个算法返回的迭代器指向最后一个被移动到目的序列的元素的下一个位置。这是一个移动操作,因此无法保证在进行这个操作之后,输入序列仍然保持不变;源元素仍然会存在,但它们的值可能不再相同了,因此在移动之后,就不应该再使用它们。如果源序列可以被替换或破坏,就可以选择使用 move...原创 2018-12-25 09:30:33 · 1315 阅读 · 0 评论 -
STL find查找算法
find() 为在输入迭代器所定义的范围内查找单个对象的算法,它可以在前两个参数指定的范围内查找和第三个参数相等的第一个对象。find 算法会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个序列的结束迭代器。下面展示了如何使用 find():std::vector<int> numbers {5, 46, -5, -6, 23, 17, 5, 9, 6, 5};...原创 2018-12-10 16:53:56 · 443 阅读 · 0 评论 -
STL merge和inplace_merge算法
合并操作会合并两个有相同顺序的序列中的元素,可以是两个升序序列,也可以是两个降序序列。结果会产生一个包含来自这两个输入序列的元素副本的序列,并且排序方式和原始序列相同。图 1 说明了其工作方式。图1合并两个vector容器中的元素merge() 算法会合并两个序列并将结果保存到第三个序列中,它使用 < 运算符来比较元素。图 1 表明合并操作被运用到 these 和 those 容器...原创 2018-12-10 16:36:10 · 980 阅读 · 0 评论 -
STL is_sorted排序算法
排序是要耗费时间的,尤其是在有大量元素时。测试元素段是否已经排好序可以避免不必要的排序操作。如果两个迭代器参数所指定范围内的元素是升序排列的,函数模板 is_sorted() 就会返回 true。为了能够顺序处理元素,迭代器至少需要是正向迭代器。提醒一下,正向迭代器支持前缀和后缀形式的自增运算。下面是一个使用 is_sorted() 的示例:std::vector<int> ...原创 2018-12-10 16:01:59 · 957 阅读 · 0 评论 -
STL lower_bound二分查找算法
二分查找一般比顺序搜索要快,但要求序列中的元素是有序的。这主要是因为二分查找的搜索机制,图 1 说明了这种机制。图 1 展示了在一个升序序列中二分查找 22 的过程。因为元素是升序排列的,所以查找机制使用小于运算符来查找元素。搜索降序序列需要使用小于运算符来比较元素。二分查找总是选择从序列中部的元素开始,并将它和搜索的值作比较。如果元素和被查找的元素相等,就认为是匹配的,所以当 !(x&l...原创 2018-12-13 16:16:33 · 422 阅读 · 0 评论 -
STL upper_bound二分查找算法
二分查找一般比顺序搜索要快,但要求序列中的元素是有序的。这主要是因为二分查找的搜索机制,图 1 说明了这种机制。图 1 展示了在一个升序序列中二分查找 22 的过程。因为元素是升序排列的,所以查找机制使用小于运算符来查找元素。搜索降序序列需要使用小于运算符来比较元素。二分查找总是选择从序列中部的元素开始,并将它和搜索的值作比较。如果元素和被查找的元素相等,就认为是匹配的,所以当 !(x&l...原创 2018-12-13 16:22:31 · 328 阅读 · 0 评论 -
STL equal_range二分查找算法
equal_range() 可以找出有序序列中所有和给定元素相等的元素。它的前两个参数是指定序列的两个正向迭代器,第三个参数是要查找的元素。这个算法会返回一个 pair 对象,它有两个正向迭代器成员,其中的 first 指向的是不小于第三个参数的一个元素,second 指向大于第三个参数的一个元素,所以我们也可以通过在单个调用中调用 lower_bound() 和 upper_bound() 来得...原创 2018-12-13 17:16:00 · 539 阅读 · 0 评论 -
STL all_of、any_of及none_of算法
algorithm 头文件中定义了 3 种算法,用来检查在算法应用到序列中的元素上时,什么时候使谓词返回 true。这些算法的前两个参数是定义谓词应用范围的输入迭代器;第三个参数指定了谓词。检查元素是否能让谓词返回 true 似乎很简单,但它却是十分有用的。例如,可以检查所有学生是否通过了考试,或者检查所有学生是否都参加了课程,或者检查有没有眼睛发绿的 Person 对象,甚至可以检查每个 D...原创 2018-12-13 17:48:36 · 338 阅读 · 0 评论 -
STL equal比较算法
可以用和比较字符串类似的方式来比较序列。如果两个序列的长度相同,并且对应元素都相等,equal() 算法会返回 true。有 4 个版本的 equal() 算法,其中两个用 == 运算符来比较元素,另外两个用我们提供的作为参数的函数对象来比较元素,所有指定序列的迭代器都必须至少是输入迭代器。用 == 运算符来比较两个序列的第一个版本期望 3 个输入迭代器参数,前两个参数是第一个序列的开始和结束...原创 2018-12-13 19:39:29 · 780 阅读 · 0 评论 -
STL reverse_copy复制算法
reverse_copy() 算法可以将源序列复制到目的序列中,目的序列中的元素是逆序的。定义源序列的前两个迭代器参数必须是双向迭代器。目的序列由第三个参数指定,它是目的序列的开始迭代器,也是一个输出迭代器。如果序列是重叠的,函数的行为是未定义的。这个算法会返回一个输出迭代器,它指向目的序列最后一个元素的下一个位置。下面是一个使用 reverse_copy() 和 copy_if() 的示例:...原创 2018-12-19 16:01:30 · 741 阅读 · 0 评论 -
STL unique移除连续项算法
unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。可以提供一个函数对象作为可选的第三个参数,这个参数会定义一个用来代替 == 比较元素的方法。例如:std::vector<string> words {"one", "two", "two", "three", "tw...原创 2018-12-19 16:45:49 · 220 阅读 · 0 评论 -
STL mismatch比较算法
equal() 算法可以告诉我们两个序列是否匹配。mismatch() 算法也可以告诉我们两个序列是否匹配,而且如果不匹配,它还能告诉我们不匹配的位置。mismatch() 的 4 个版本和 equal() 一样有相同的参数——第二个序列有或没有结束迭代器,有或没有定义比较的额外的函数对象参数。mismatch() 返回的 pair 对象包含两个迭代器。它的 first 成员是一个来自前两个参...原创 2018-12-14 10:03:04 · 629 阅读 · 0 评论 -
STL lexicographical_compare字符串排序算法
两个字符串的字母排序是通过从第一个字符开始比较对应字符得到的。第一对不同的对应字符决定了哪个字符串排在首位。字符串的顺序就是不同字符的顺序。如果字符串的长度相同,而且所有的字符都相等,那么这些字符串就相等。如果字符串的长度不同,短字符串的字符序列和长字符串的初始序列是相同的,那么短字符串小于长字符串。因此 “age” 在“beauty” 之前,“a lull” 在 “a storm” 之前。显然,...原创 2018-12-14 10:33:09 · 252 阅读 · 0 评论 -
STL next_permutation排序算法
排列就是一次对对象序列或值序列的重新排列。例如,“ABC”中字符可能的排列是:"ABC", "ACB", "BAC", "BCA", "CAB", "CBA"三个不同的字符有 6 种排列,这个数字是从 3*2*1 得到的。一般来说,n 个不同的字 符有 n! 种排列,n! 是 nx(n_1)x(n-2)...x2x1。很容易明白为什么要这样算。有 n 个对象 时,在序列的第一个位原创 2018-12-14 11:16:46 · 199 阅读 · 0 评论 -
STL prev_permutation排序算法
next_permutation() 是按照字典升序的方式生成的排列。当我们想以降序的方式生成排列时,可以使用 prev_permutation()。prev_permutation 和 next_permutation() 一样有两个版本,默认使用 < 来比较元素。因为排列是以降序的方式生成的,所以算法大多数时候会返回 true。当生成最大排列时,返回 false。例如:std:...原创 2018-12-14 11:23:49 · 239 阅读 · 0 评论 -
STL is_permutation排序算法
is_permutation() 算法可以用来检查一个序列是不是另一个序列的排列,如果是,会返回 true。下面是在这个算法中使用 lambda 表达式的示例:std::vector<double> data1{ 44.5, 22.0, 15.6, 1.5 };std::vector<double> data2{ 22.5, 44.5, 1.5, 15.6 };s...原创 2018-12-14 11:49:49 · 315 阅读 · 0 评论 -
STL sort排序算法
在很多应用中,排序都是至关重要的,而且很多 STL 算法也只适用于有序对象序列。定义在 algorithm 头文件中的函数模板 sort<Iter>() 默认会将元素段排成升序,这也就意味着排序的对象的类型需要支持 < 运算符。 对象也必须是可交换的,这说明可以用定义在 utility 头文件中的函数模板 swap() 来对两个对象进行交换。这进一步表明这种对象的类型需要实现...原创 2018-12-10 13:53:28 · 258 阅读 · 0 评论 -
STL stable_sort排序算法
sort() 算法可能会改变相等元素的顺序,有时候这不是我们想要的。假设有一个保存某种事务的容器,或许是银行账户。进一步假设,在处理它们之前,为了能够有序更新这些账户,需要按照账号对这些事务排序。如果出现相等事务的顺序反映的是它们添加到容器的时间顺序,就需要维持这个顺序不变。如果允许对给定账户的事务进行重新排列,可能会出现透支的情况。这种情况下,stable_sort() 算法可以满足我们的要...原创 2018-12-10 14:58:11 · 464 阅读 · 0 评论 -
STL partial_sort排序算法
通过示例很容易理解什么是部分排序。假设有一个容器,它保存了 100 万个数值,但我们只对其中最小的 100 个感兴趣。可以对容器的全部内容排序,然后选择前 100 个元素,但这可能有点消耗时间。这时候需要使用部分排序,只需要这些数中的前100个是有序放置的。对于部分排序,有一个特殊的算法 partial_sort(),它需要 3 个随机访问迭代器作为参数。如果这个函数的参数是 first、se...原创 2018-12-10 15:24:34 · 437 阅读 · 6 评论 -
STL nth_element排序算法
nth_element() 算法和 partial_sort() 不同。应用的范围由它的第一个和第三个参数指定。第二个参数是一个指向第 n 个元素的迭代器。如果这个范围内的元素是完全有序的,nth_dement() 的执行会导致第 n 个元素被放置在适当的位置。这个范围内,在第 n 个元素之前的元素都小于第 n 个元素,而且它后面的每个元素都会比它大。算法默认用 <运算符来生成这个结果。...原创 2018-12-10 15:34:44 · 638 阅读 · 0 评论 -
STL swap_ranges交换序列算法
可以用 swap_ranges() 算法来交换两个序列。这个算法需要 3 个正向迭代器作为参数。前两个参数分别是第一个序列的开始和结束迭代器,第三个参数是第二个序列的开始迭代器。显然,这两个序列的长度必须相同。这个算法会返回一个迭代器,它指向第二个序列的最后一个被交换元素的下一个位置。例如:using Name = std::pair<string, string>; // Fi...原创 2018-12-25 09:43:11 · 289 阅读 · 0 评论