STL算法函数(175)

算法记录

算法

算法名 算法用途 算法名 算法用途
accumulate 元素累计 fill 改填元素值
adjacent_find 查找相邻而重复的元素 fill_n 改填元素值,n次
find 循序查找
binary_search 二分查找 find_if 循序查找符合特定条件者
copy 复制 find_end 查找某个子序列最后一次出现点
copy_backward 逆向复制 find_first_of 查找某些元素的首次出现点
copy_n 复制n个元素
count 计数 for_each 代码见
count_if 特定条件下计数 generate 以特定操作之运算结果填充特定区间内的元素
equal 判断两个区间相等与否 generate_n 同上,多个n个元素内容
equal_range 在有序区间中寻找某值
includes 是否涵盖于某序列中 max_element 最大值所在位置
inplace_merge 合并并就地替换上去 merge 合并俩个序列
is_sorted 判断区间是否已排序 min_element 同理
iter_swap 元素互换 mismatch 找出不匹配点
lower_bound 将指定元素插入区间之内
而不影响区间之原本排序的最低位置
partial_sort 局部排序 partition 分割
partial_sort_copy 局部排序并复制到他处 power 幂次方
partial_sum 局部求和
remove 删除(假的) replace 替换某类元素
remove_copy 删除某类元素并将结果复制到另一个容器 replace_copy 替换某类元素将结果复制到另一个容器
remove_if 有条件删除(也是假的) replace_if
remove_copy_if replace_copy_if
reverse 反转元素次序 swap 置换
reverse_copy transform 一俩序列为基础,交互作用产生第三个序列
sort 排序 unique 将重复的元素折叠缩编,使成唯一
rotate 从middle俩端分开,进行交换 rotate_copy
search 从序列一中寻找序列二首次出现点 search_n
swap_ranges 区间互换
next_permutation 下一个排序序列 prev_permutation 上一个排序序列
random_shuffle 将区间元素次序随机重排 nth_element 以middle为中线,op返回false放middle右边,true放左边,比sort快
front_inserter 头插入(迭代器必须支持push_front (“vector无”)) back_inserter 尾插入(迭代器必须支持push_back)
inserter 指定位置插入(迭代器必须支持insert)

xfunctional文件里面实现了为大多数的一般算法提供的仿函数


accumulate


++
1
2
3
4
5
6
7
std::accumulate(iv.begin(), iv.end(), da, plus<int>()) == std::accumulate(iv.begin(), iv.end(), da);
return值为da + 1 + 2 + 3 + 4 + 5;
std::accumulate(iv.begin(), iv.end(), da, minus<int>());
return值为da - 1 - 2 - 3 - 4 - 5;<br/><
//把da作为第一个左值,一个一个获取右值。运算后再返回为下一个左值


equal

判断之前最好先比较元素个数是否相等。
判断原作就是 if (first1 != first2) return false;


fill

fill_n

这俩个真没啥说的。


iter_swap

这个调用要重写 operator= 函数


mismatch


++
1
2
3
4
5
while(first1 != last1 && *first1 == *first2) { ++first1; ++first2; }
return pair<InputIterator1, InputIterator2><first1, first2>;
返回值很有意思可以探究


copy

copy_backward

后者是逆向复制。

copy是允许覆盖的即copy(p.begin(), p.end() - 1, p.begin() + 1);这种形式。
但是有注意点:

1、对第三个参数是没有边界判断的,如果小了,会崩溃。
2、对deque无效,会全部变成第一参数的值;只vector才行。 (具体原因没细究)


SET

这些函数有set,表面看上去像给set用的,然而不止这么简单。只要有序,就都可以

s1由于只是访问,可以set、vector等;s2同;

s3由于需要被赋值,vector等可以,但set是不行的。s3还有个限制,如果没有resize的空间,赋值会错误。

set_union

它是set的操作
合并俩个set为一个set,第三个set依旧需要给与足够空间,不然也会运行错误。


set_intersection

它是set的操作
它求俩个set的交集,第三个set依旧需要给与足够空间,不然也会运行错误。


set_difference

它是set的操作
它是求两个set的不同,出现于s1但不出现于s2的元素,赋值到s3。s3依旧需要空间。


adjacent_find


++
1
2
3
4
cout << *adjacent_find(iv.begin(), iv.end());//这个默认是找iv中相邻元素值相等的第一个元素
cout << *adjacent_find(iv.begin(), iv.end(), equal_to<int>());//第三个是自定义,比较函数,会把相邻元素传入,自己函数比较返回bool


count

count_if

  1. 依旧使用的是 if (*first == value),operator ==
  2. count_if第三个参数是函数,也就循环传入元素进函数,自己判断bool,函数再++
  3. bind2nd(less<int>(), 7)bind2nd(greater<int>(), 2)

find

find_if

find_end

find_first_of

  1. not1(bind2nd(modulus(),3))。//vector_finder(13,1003),类型要有有构造函数和bool operator ()( value_type &value)就好
  2. find_end查找first1到last1中最后一次出现first2到last2区间的元素,返回first2在first1区间中最后一次出现元素。
  3. find_end支持自定义仿函数如equal_to<int> ()
  4. find_first_of则相反

generate

generate_n

  1. 将仿函数运算结果填写在first到last中,仿函数是无参数传入

max_element


返回区间中的最大值


min_element


返回区间中的最小值


merge

  1. 将两个有序集合,合并放入另一段空间
  2. 第5个参数result作为放入空间,必须resize足够大
  3. 支持第6个参数,自定义比较函数来排序摆放

partition

  1. 所有被第三个参数pred判断为true元素会被放在区间的前段,被判断为false的元素会被仿在后段。
  2. 没有排序功能,无返回

remove

remove_if

remove_copy

remove_copy_if

  1. remove老特性,不说了,remove调用的是remove_copy,它只管赋值到新目标,不管保护数据
  2. remove_copy如果不等第四个参数,就赋值给第三个参数。所以第三个参数要保证能++,能有足够多的空间去容纳
  3. remove_if调用的是remove_copy_if,把前面的value值全替换成了pred仿函数

replace

replace_copy

replace_if

replace_copy_if

  1. replace 从区间中寻找第三个参数,用第四个参数替换了。
  2. replace_copy 与上相比多个把寻找结果放入result中
  3. replace_if 自定义仿函数
  4. 需要resize

reverse

reverse_copy

  1. 颠倒重排
  2. 新序列结果放入result,同样需要resize

reverse

reverse_copy

  1. [first, middle), [middle, last),对这俩个数组进行互换。

search_n

  1. 如果未找到要返回,last1
  2. search_n查找连续n个符合条件的元素(他只能找元素不能找区间),如果找不到就返回last1

swap_ranges


将[first1, last1)区间内的元素与”从first2开始、个数相同”的元素互换。这两个序列可位于同一容器中,也可位于不同容器(长度不好说)


transform

  1. 第一个版本,把first到last区间执行op,结果放入result;返回result最后被赋值元素(result需要resize)
  2. 第二个版本,把俩个区间执行op(op,第一个参数是f1区间里的,第二个参数f2区间的),放入result里

unique

  1. 移除重复的元素
  2. 它只能移除相邻元素的重复元素,所以要想移除所有的,必须先排序。

lower_bound

  1. 试图在已排序的[first, last)中找value
  2. 如果有就返回第一个指向元素,如果没有便返回指向第一个“不小于value”的元素
    这就意味着总是要返回值的。

upper_bound

  1. 返回可插入value的最后一个合适位置
    也就是说,如果value存在,返回的是指向value的下一个位置,而不是value。不存在则和上同理。

  1. 这个函数本质是调用lower_bound,但是它返回的是true和false,
  2. 第二个版本,允许自己指定comp比较函数。

next_permutation

prev_permutation

  1. 获取下一个排序序列。
  2. 允许op自定义函数,官方解释说:返回的值表示第一个参数是否被认为是在特定的严格弱排序它定义的第二个之前

partial_sort

partial_sort_copy

  1. 从first到last找middle-first个最小元素,进行排序(默认递增less<int>() 可用greater<int>()等自定义)。
  2. 只能保证[first, middle)是递增排序,不能保证[middle, last)是排序序列
  3. 当用sort对整个排序,再取前middle-first; 能达到同等效果,但是效率没有此函数高。
  4. 允许自定义比较函数
  5. partial_sort_copy复制到result.begin(),result.end();

equal_range

  1. lower_boundupper_bound的结合,返回一个pair,pair记录的就是前俩函数的结果

front_inserter

back_inserter

inserter

  1. 正如标题所说的那样,如果相关迭代器没有对应的函数,执行会错误。
  2. 如果单独使用 std::back_inserter(numbers) = 6; std::inserter(numbers, numbers.begin()+1) = 6这样,numbers的size会增加,并且最后的值被赋值为6
  3. 一般无单独使用,多是配合copy; copy(ia, ia + 3, back_inserter(id))这样id后面就插入了ia到ia+3的数据
// //