天天看点

C++泛型算法1、什么是泛型算法2、算法定义位置3、如何使用泛型算法4、算法的命名规则(帮助记忆)5、谓词

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)用就可。