1、什么是泛型算法
泛型算法是C++标准库提供给各种容器的通用算法接口。这些算法包含了常用的查找,排序,删除、替换、集合、关系等等操作,此外算法独立于容器之外,适合各种类型的容器和数据。
2、算法定义位置
【1】通用的泛型算法定义在<algorithm>头文件中
【2】数值相关的算法定义在<numeric>头文件
3、如何使用泛型算法
泛型算法需要容器的迭代器作为输入,调用算法的基本形式为以下四种:
alg(beg, end, other args);
alg(beg, end, dest, other args);
alg(beg, end, beg2, other args);
alg(beg, end, beg2, end2, other args);
其中alg是算法名称,beg和end表示算法的操作范围,dest表示算法的输出位置。其中beg,end和dest均为容器的迭代器。
4、算法的命名规则(帮助记忆)
【1】重载
使用数值比较的算法通常提供重载版本接受一个谓词来替代默认的<或者==。例如
unique(beg,end) //使用 == 运算符比较元素
unique(beg, end, cmp) //使用自定义的cmp函数比较元素
【2】 _if版本
接受一个元素值的算法通常提供一个带_if后缀的版本,该版本接受一个一元谓词(可以粗略的理解为返回值为bool类型的函数)来代替该数值。
find(beg, end, value) //寻找等于value的元素第一次出现的位置
find_if(beg, end, pred) //寻找使pred为True的元素第一次出现的位置
e.g.
find_if(beg,end, [](int i){ return i%2 }) //寻找第一个偶数出现的位置
【3】_copy版本
重排算法默认将重排后的元素写会输入的序列中,_copy版本接受一个输出位置,将重排后的元素写入指定位置。
reverse(beg, end) //反转后的元素写会原序列
reverse_copy(beg, end, dest) //反转后的元素写入dest
【4】某些算法同时提供_copy和_if算法。例如
remove_copy_if(beg, end, pred)
5、谓词
谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。可以是返回值为bool的函数,也可以是返回值为bool的lambda表达式。总之这个表达式的返回结果可以被当做条件(true,false,0,1)用就可。