1、泛型算法:建立在容器上的操作。
泛型:算法适用于不同的容器和数据类型。
2、头文件:#include<algorithm> //大多数泛型算法
#include<numeric> //数值泛型算法
3、迭代器使算法不依赖于容器,算法依赖于元素类型的操作。标准库算法对一定范围内的元素进行操作,这个范围是输入范围。算法不会执行容器操作(扩展容器、删除元素)。
4、
(1)只读算法:
accumulate(c.cbegin(),c.cend(),初始值) // 求一个范围元素的和,初始值若为string则应为string("str")
equal(c.cbegin(),c.cend(),d.cbegin()) //比较d与c是否相等
(2)写容器元素算法:
fill(c.begin(),c.end(),string("str")) //将所有元素置为str
fill_n(c.begin(),n,val) //将n个元素置为val
back_inserter(vec) //返回指向该向量的迭代器
(3)拷贝算法:
auto c=copy(begin(a),end(a),b); //copy 将a数组的一定范围内的元素拷贝到b中,返回b尾元素之后的位置。
(4)容器元素排序算法:
sort(a.begin(),a.end()); //从小到大对容器中的元素排序
auto unique_end=unique(story.begin(),story.end()); // unique函数将排序后重复的元素移动到最后,返回最后一个不重复元素的下一个位置。还要调用erase删除重复元素。
谓词:可调用的表达式,有一元谓词(一个参数)和二元谓词(二个参数),谓词的参数类型要与元素的参数类型保持一致。
bool isShorter(const string&s1,const string&s2) //二元谓词
{return s1.size()<s2.size();}
sort(a.begin(),a.end(),isShorter); //单词从短到长排序
(5)定制操作
lambda表达式:[capture list](parameter list)->return type{function body}
捕获列表(调用lambda的函数的局部变量),参数列表,返回值类型可以省略。调用时与调用函数相同。可以当成谓词使用。
auto f=[]{return 45;} ; cout<<f();
auto f=[v1]{return v1;};
auto f=[&v1]{return v1;};
[&]{} 、 [=]{} //lambda可以推断要使用的变量。(&:推断使用的引用,=:推断使用的值)
transform(a.begin(),a.end(),a.begin(),[](int i)->int{if(i>3) return 3;else return 0;)}; //含if语句要指定返回值类型
(6)迭代器:
插入迭代器:绑定到容器上,用于插入元素 back_inserter front_inserter inserter
流迭代器:绑定到输入、输出流上,遍历IO流 istream_iterator ostream_iterator
反向迭代器:从尾元素到首元素移动。 // rbegin() rend();
移动迭代器:移动元素
(7)泛型算法模式:
alg(beg,end,other args);
alg(beg,end,dest,other args); //dest:位置
alg(beg,end,beg2,other args);
alg(beg,end,beg2,end2,other args);
(8)泛型算法的操作对象:
容器、数组、IO流。算法在迭代器上操作,与实现类型无关。