#include<iostream>#include<vector>#include<algorithm>#include<numeric>usingnamespace std;intfunc(){staticint i=0;return i++;}intmain(){
vector<int>vec(10);generate(vec.begin(),vec.end(),func);for(auto n:vec){
cout << n <<" ";}
cout << endl;auto p =remove(vec.begin(),vec.end(),2);// 只是覆盖,不是真正的删除
vec.erase(p,vec.end());// 要真正删除干净还需要erasefor(auto n:vec){
cout << n <<" ";}
cout << endl;}
结果为:
0123456789013456789
5.3 替换
函数
作用
replace(beg,end,oval,nval)
将[beg,end)内所有等于oval的元素都用nval代替。
replace_copy(beg,end,res,oval,nval)
与replace()类似,不过将结果写入res。
replace_if(beg,end,pred,nval)
将[beg,end)内所有pred为true的元素用nval代替。
replace_copy_if(beg,end,res,pred,nval)
与replace_if(),不过将结果写入res。
5.4 去重
函数
作用
unique(beg,end)
清除序列中相邻重复元素,不能真正删除元素。重载版本使用自定义比较操作。排好序的才有意义
unique(beg,end,pred)
将所有使pred结果为true的相邻重复元素去重。
unique_copy(beg,end,res)
与unique类似,不过把结果输出到res。
unique_copy(beg,end,res,pred)
与unique类似,不过把结果输出到res。
5.5 交换
函数
作用
swap(a,b)
交换存储在a与b中的值。
swap_range(beg1,end1,beg2)
将[beg1,end1)内的元素[beg2,beg2+beg1-end1)元素值进行交换。
iter_swap(it_a,it_b)
交换两个ForwardIterator的值。
6. 算术算法
函数
作用
accumulate(beg,end,val)
对[beg,end)内元素之和,加到初始值val上。
accumulate(beg,end,val,binary)
将函数binary代替加法运算,执行accumulate()。
accumulate 的默认用法:
#include<iostream>#include<vector>#include<algorithm>#include<numeric>usingnamespace std;intfunc(){staticint i=0;return++i;}intmain(){
vector<int>vec(10);// 有10个元素,目前都是0generate(vec.begin(),vec.end(),func);for(auto n:vec){
cout << n <<" ";}
cout << endl;int sum =0;for(auto n:vec){
sum += n;}
cout << sum << endl;int res =accumulate(vec.begin(),vec.end(),0);// 0为sum的初始值,默认是加法
cout << res << endl;}
结果为:
123456789105555
accumulate 的累乘用法:
#include<iostream>#include<vector>#include<algorithm>#include<numeric>usingnamespace std;intfunc(){staticint i=0;return++i;}intmulitply(int res,int n){return res*n;}intmain(){
vector<int>vec(10);// 有10个元素,目前都是0generate(vec.begin(),vec.end(),func);for(auto n:vec){
cout << n <<" ";}
cout << endl;int sum =1;for(auto n:vec){
sum *= n;}
cout << sum << endl;int res =accumulate(vec.begin(),vec.end(),1,mulitply);
cout << res << endl;}
结果为:
1234567891036288003628800
accumulate 在库中的模板:
template<classIt,classT>
T accumulate(It first,It last,T init){
T res = init;for(It it=first;it!=last;++it){
res +=*it;}return res;}template<classIt,classT,classFunc>
T accumulate(It first,It last,T init,Func func){
T res = init;for(It it=first;it!=last;++it){
res =func(res,*it);}return res;}