算法记录
算法
算法名 | 算法用途 | 算法名 | 算法用途 |
---|---|---|---|
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
++ 1234567
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
++ 12345
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
|
|
count
count_if
- 依旧使用的是 if (*first == value),operator ==
- count_if第三个参数是函数,也就循环传入元素进函数,自己判断bool,函数再++
bind2nd(less<int>(), 7)
,bind2nd(greater<int>(), 2)
find
find_if
find_end
find_first_of
- not1(bind2nd(modulus
(),3))。// vector_finder(13,1003)
,类型要有有构造函数和bool operator ()( value_type &value)就好 - find_end查找first1到last1中最后一次出现first2到last2区间的元素,返回first2在first1区间中最后一次出现元素。
- find_end支持自定义仿函数如
equal_to<int> ()
- find_first_of则相反
generate
generate_n
- 将仿函数运算结果填写在first到last中,仿函数是无参数传入
max_element
返回区间中的最大值
min_element
返回区间中的最小值
merge
- 将两个有序集合,合并放入另一段空间
- 第5个参数result作为放入空间,必须resize足够大
- 支持第6个参数,自定义比较函数来排序摆放
partition
- 所有被第三个参数pred判断为true元素会被放在区间的前段,被判断为false的元素会被仿在后段。
- 没有排序功能,无返回
remove
remove_if
remove_copy
remove_copy_if
- remove老特性,不说了,remove调用的是remove_copy,它只管赋值到新目标,不管保护数据
- remove_copy如果不等第四个参数,就赋值给第三个参数。所以第三个参数要保证能++,能有足够多的空间去容纳
- remove_if调用的是
remove_copy_if
,把前面的value值全替换成了pred仿函数
replace
replace_copy
replace_if
replace_copy_if
- replace 从区间中寻找第三个参数,用第四个参数替换了。
- replace_copy 与上相比多个把寻找结果放入result中
- replace_if 自定义仿函数
- 需要resize
reverse
reverse_copy
- 颠倒重排
- 新序列结果放入result,同样需要resize
reverse
reverse_copy
- [first, middle), [middle, last),对这俩个数组进行互换。
search
search_n
- 如果未找到要返回,last1
- search_n查找连续n个符合条件的元素(他只能找元素不能找区间),如果找不到就返回last1
swap_ranges
将[first1, last1)区间内的元素与”从first2开始、个数相同”的元素互换。这两个序列可位于同一容器中,也可位于不同容器(长度不好说)
transform
- 第一个版本,把first到last区间执行op,结果放入result;返回result最后被赋值元素(result需要resize)
- 第二个版本,把俩个区间执行op(op,第一个参数是f1区间里的,第二个参数f2区间的),放入result里
unique
- 移除重复的元素
- 它只能移除相邻元素的重复元素,所以要想移除所有的,必须先排序。
lower_bound
- 试图在已排序的[first, last)中找value
- 如果有就返回第一个指向元素,如果没有便返回指向第一个“不小于value”的元素
这就意味着总是要返回值的。
upper_bound
- 返回可插入value的最后一个合适位置
也就是说,如果value存在,返回的是指向value的下一个位置,而不是value。不存在则和上同理。
binary_search
- 这个函数本质是调用
lower_bound
,但是它返回的是true和false, - 第二个版本,允许自己指定comp比较函数。
next_permutation
prev_permutation
- 获取下一个排序序列。
- 允许op自定义函数,官方解释说:返回的值表示第一个参数是否被认为是在特定的严格弱排序它定义的第二个之前
partial_sort
partial_sort_copy
- 从first到last找middle-first个最小元素,进行排序(默认递增
less<int>()
可用greater<int>()
等自定义)。 - 只能保证[first, middle)是递增排序,不能保证[middle, last)是排序序列
- 当用sort对整个排序,再取前middle-first; 能达到同等效果,但是效率没有此函数高。
- 允许自定义比较函数
partial_sort_copy
复制到result.begin(),result.end();
equal_range
lower_bound
和upper_bound
的结合,返回一个pair,pair记录的就是前俩函数的结果
front_inserter
back_inserter
inserter
- 正如标题所说的那样,如果相关迭代器没有对应的函数,执行会错误。
- 如果单独使用
std::back_inserter(numbers) = 6;
std::inserter(numbers, numbers.begin()+1) = 6
这样,numbers的size会增加,并且最后的值被赋值为6 - 一般无单独使用,多是配合copy;
copy(ia, ia + 3, back_inserter(id))
这样id后面就插入了ia到ia+3的数据