1、普通算法在<algorithm>,有一部分数值算法在<numeric>,比如accumulate。
2、有很多算法,具有多种特性,比如for_each()算法,既是非变动算法,也是变动算法。对于这些问题不要深究。
3、一般情况下,仿函数的operator()应该为const,不然会有很多问题。很多算法都要求仿函数不能改变自身状态。
4、下面的表格是手打的,累死了。
函数 | 功能 | 说明 | ||
非变动算法 | ||||
for_each | 每个元素执行操作 | 可以返回变动后的仿函数 | ||
count | 返回元素个数 |
| ||
count_if | 符合条件的元素个数 |
| ||
min_element | 最小元素的迭代器 | 注意是迭代器啊! | ||
max_element | 最大元素的迭代器 |
| ||
find | 搜寻某值的第一个元素 |
| ||
find_if | 满足某条件的第一个元素 |
| ||
search_n | 搜寻满足某条件的第一段连续的N个元素 | 不一定是相同的N个连续元素,而是符合条件(比较的是值)的。比如我可以找到一个奇-偶-奇的序列。search_n的一个实作形式很奇怪,不适用配接器,需要留意一下。 | ||
search | 某个子区间第一次出现的位置 | 与search_n的不同在于,要比较的两个序列,其中一个是满足条件的另外一个序列的子区间,而且是连续的。 | ||
find_end | 某个子区间最后出现的位置 | 注意搜寻的是区间 | ||
find_first_of | 给定几个值,返回等于其中某个值的第一个元素 | 注意,只要是给定的元素中的任何一个被找到了,就返回,而不是搜寻区间。 | ||
adjacent_find | 搜寻两个相等(或者符合条件)的元素 |
| ||
equal | 判断两个区间是否相等 |
| ||
mismatch | 比较两个序列的对应值,返回第一对不等值的元素 | 返回pair。 | ||
lexicographical_compare | 用字典序比较两个序列 |
| ||
变动性算法 | ||||
for_each | 见上面 | 可以实现transform的操作,但是做法不同。 | ||
copy | 复制 | 如何读取string之后再打印: copy(istream_iterator<string>(cin), istream_iterator(), ostream_iterator<string>(cout, “\n”)); | ||
copy_backward | 从最后一个元素开始复制 |
| ||
transform | 变动并复制元素到目标区间 | 速度比for_each慢,因为不是对目标直接操作而是生成结果再复制到目标。 | ||
merge | 合并两个区间 |
| ||
swap_ranges | 交换区间元素 | 空间要足够,不能重叠。 | ||
fill | 以定值替换每一个元素 |
| ||
fill_n | 以定值替换N个元素 | 相比fill,只是指定了要替换多少个元素。 | ||
generate | 以某项操作的结果替换元素 |
| ||
generate_n | 以某项操作的结果替换N个元素 | 和fill之于fill_n的差别一样。 | ||
replace | 把等于某值的元素替换为指定值 |
| ||
replace_if | 把符合某条件的元素替换为指定值 | 只是多了个条件判断而已。 | ||
replace_copy | 复制区间时,把指定元素替换 | 相当于copy之后,再来个replace | ||
replace_copy_if | 复制区间时,把符合条件的元素替换 | 相当于copy之后,再来个replace_if | ||
移除性算法 | ||||
remove | 将某特定值的元素全部移除 | 并没有真正删除元素,必须调用容器的erase函数,因为规定只有容器自己可以添加删除 | ||
remove_if | 将符合条件的元素移除 | 这两个返回被“删除”元素的第一个位置。 | ||
remove_copy | 将不等于某值的元素全部复制到他处 | copy加remove函数的组合。原始区间的数据并没有改变 | ||
remove_copy_if | 将不满足条件的元素复制到他处 |
| ||
unique | 移除毗邻的重复元素 | 经常配合的去重复操作:sort(coll.begin(), coll.end());coll.erase(unique(coll.begin(), coll.end()), coll.end()); list容器用自己的unique函数。 | ||
unique_copy | 移除毗邻的重复元素,并复制到他处 | 原始区间是不变的。 | ||
变序性算法 | ||||
reverse | 逆转次序 | list容器使用自己的reverse函数。 | ||
reverse_copy | 复制的同时,逆转元素 | 原始区间是不变。 | ||
rotate | 旋转元素次序 | 头尾旋转,类似shift | ||
rotate_copy | 复制的同时旋转 | 原始区间是不变。 | ||
next_permutation | 下一个全排列次序 | 字典序排列 | ||
prev_permutation | 上一个全排列次序 |
| ||
random_shuffle | 打乱元素顺序 | 挺有用的一个东西。请留意C的random内容。 | ||
partition | 符合某准则的元素放在前面 |
| ||
stable_partition | 在partition的基础上,不改变元素次序 |
| ||
排序算法 | ||||
sort | 排序 | 快速排序法。list要用自己的sort成员函数。 | ||
stable_sort | 稳定排序 | 归并排序,速度慢。 | ||
partial_sort | 给出前N个已序区间 | 排完前N个,后面的就不管了。采用heapsort,速度慢。 | ||
partial_sort_copy | 把partial_sort的前N个已序区间复制 |
| ||
nth_element | 把所有小于特定值的元素放在前面 | 没有排序,只是分界,两个部分是乱序的。 | ||
make_heap | 把一个区间变成heap堆 |
| ||
push_heap | 向heap加入一个元素 |
| ||
pop_heap | 从heap移除一个元素 |
| ||
sort_heap | 对heap排序 | 排完序就不是heap堆了。这四个操作一般联用。 | ||
已序区间算法(无序区间产生一个未知的结果) | ||||
binary_search | 判断某区间是否包含某元素 | 返回bool。 | ||
includes | 判断某区间是不是另一区间的子集 | 不一定要是连续的相同区间,只要包含有每一个元素就行了。返回bool | ||
lower_bound | 第一个大于等于>=给定值的元素 |
| ||
upper_bound | 第一个大于给定值的元素 | 这个没有等于条件。 | ||
equal_range | 等于给定值的元素区间 | 等价于make_pair(lower_bound(), upper_bound)。注意是返回一个pair 。 | ||
merge | 合并两个已序区间 |
| ||
set_union | 求区间并集 | 如果某个区间本来就有重复的元素,则目标区间就有重复元素,元素数目是两个区间中最多的那个。 | ||
set_intersection | 求区间交集 | 元素重复个数按两个区间中个数最少的计算 | ||
set_difference | 在第一个区间但不在第二个区间的元素 | 一定要预先排好序,不然没用。如果第一个区间的重复个数不如第二个,则没有该元素。 | ||
set_symmetric_difference | 找出只出现在两个区间之一的元素 | 重复个数是对应区间重复数量的差集。 | ||
inplace_merge | 区间分为两个已序片段,排序两个片段 | 它与merge的区别在于,两个区间是挨在一起的,或者说就是一个区间,只不过前后部分分别有自己的顺序。 | ||
数值算法 | ||||
accumulate | 组合所有元素(总和,乘积等等) | 如果用在string身上,就是字符串的连接操作。 | ||
inner_product | 组合两个区间的所有元素(内积) |
| ||
adjacent_difference | 将每个元素与前一元素组合(差分,微分) | 这个类似于差分,你也可以自己传入操作准则改变运算规则。 | ||
partial_sum | 将每个元素与先前所有元素组合(积分,求和) | 和matlab的cumsum函数一样。与adjacent_difference运算刚好相反,数据可以在两个操作之间互相转化。 |