算法
- 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
- <algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、反转、排序、合并等等。
- <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
- <functional>中则定义了一些模板类,用以声明函数对象。
- STL提供了大量实现算法的模版函数,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能,从而大大地提升效率。
- #include <algorithm>
- #include <numeric>
- #include <functional>
算法分类
操作对象
- 直接改变容器的内容
- 将原容器的内容复制一份,修改其副本,然后传回该副本
功能:
- 非可变序列算法 指不直接修改其所操作的容器内容的算法
- 计数算法 count、count_if
- 搜索算法 search、find、find_if、find_first_of、…
- 比较算法 equal、mismatch、lexicographical_compare
- 可变序列算法 指可以修改它们所操作的容器内容的算法
- 删除算法 remove、remove_if、remove_copy、…
- 修改算法 for_each、transform
- 排序算法 sort、stable_sort、partial_sort、
- 排序算法 包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作
- 数值算法 对容器内容进行数值计算
常用算法
遍历算法
- for_each() : 用指定函数依次对指定范围内所有元素进行迭代访问。该函数不得修改序列中的元素。
- transform() : 与for_each类似,遍历所有元素,但可对容器的元素进行修改。
查找算法
- adjacent_find() : 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end。
- binary_search() : 在有序序列中查找value,找到则返回true。不可再无序序列中使用。
- count() : 把标志范围内的元素与输入值比较,返回相等的个数
- count_if() : 把标志范围内的元素与输入函数对象比较,返回相等个数
- find() : 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的迭代器。
- find_if() : 使用输入的函数代替等于操作符执行find。返回被找到的元素的迭代器。
排序算法
- merge() : 合并两个有序序列,存放到另一个序列。
- sort() : 以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。
- random_shuffle() : 对指定范围内的元素随机调整次序。
- reverse() : 对指定范围内的元素进行倒序
拷贝和替换算法
- copy() : 对指定范围内的元素进行拷贝,放入以输入参数为开头的容器中
- replace(beg, end, oldValue, newValue) : 将指定范围内的所有等于oldValue的元素替换成newValue。
- replace_if() : 将指定范围内所有操作结果为true的元素用新值替换
- swap() : 交换两个容器的元素
算数和生成算法
- accumulate() : 对指定范围内的元素求和,然后结果再加上一个由val指定的初始值。
- fill() : 将输入值赋给标志范围内的所有元素。
集合算法
- set_union() : 构造一个有序序列,包含两个有序序列的并集。
- set_intersection() : 构造一个有序序列,包含两个有序序列的交集。
- set_difference() : 构造一个有序序列,该序列保留第一个有序序列中存在而第二个有序序列中不存在的元素。
算法中的函数对象和谓词
函数对象:
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。
这是通过重载类的operator()来实现的。
“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为;
谓词:
一元函数对象:函数参数1个;
二元函数对象:函数参数2个;
一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式
预定义函数对象
算术函数对象
预定义的函数对象支持加、减、乘、除、求余和取反。调用的操作符是与type相关联的实例
加法:plus<Types>
plus<string> stringAdd;
sres = stringAdd(sva1,sva2);
减法:minus<Types>
乘法:multiplies<Types>
除法divides<Tpye>
求余:modulus<Tpye>
取反:negate<Type>
negate<int> intNegate;
ires = intNegate(ires);
Ires= UnaryFunc(negate<int>(),Ival1);
关系函数对象
等于equal_to<Tpye>
equal_to<string> stringEqual;
sres = stringEqual(sval1,sval2);
不等于not_equal_to<Type>
大于 greater<Type>
大于等于greater_equal<Type>
小于 less<Type>
小于等于less_equal<Type>
逻辑函数对象
逻辑与 logical_and<Type>
logical_and<int> indAnd;
ires = intAnd(ival1,ival2);
dres=BinaryFunc( logical_and<double>(),dval1,dval2);
逻辑或logical_or<Type>
逻辑非logical_not<Type>
logical_not<int> IntNot;
Ires = IntNot(ival1);
Dres=UnaryFunc( logical_not<double>,dval1);
函数适配器
标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象。常用适配器是:
1绑定器(binder): binder通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象。C++标准库提供两种预定义的binder适配器:bind1st和bind2nd,前者把值绑定到二元函数对象的第一个实参上,后者绑定在第二个实参上。
2取反器(negator) : negator是一个将函数对象的值翻转的函数适配器。标准库提供两个预定义的ngeator适配器:not1翻转一元预定义函数对象的真值,而not2翻转二元谓词函数的真值。
常用函数适配器列表如下:
bind1st(op, value)
bind2nd(op, value)
not1(op)
not2(op)
mem_fun_ref(op)
mem_fun(op)
ptr_fun(op)