【C++】《C++标准程序库》小结第九章-算法

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运算刚好相反,数据可以在两个操作之间互相转化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值