范型算法,可以在多种容器类型上操作,一般是通过迭代器向函数传递需要操作的元素。
一、常用算法
#include<algorithm>
#include<numeric>
1、find()函数:查找
find(b,e,val) 在迭代器b,e标记的范围内(包括b,不包括e)查找值val,要求迭代器指向的元素能够与val值进行相等(==)操作。查找成功则返回指向相等元素的迭代器,否则返回e。若val及迭代器的元素不支持相等操作,则可以加一个函数名参数,由该函数判断是否相等。
2、accumulate()函数:累加
accumulate(b,e,val) val为累加的初始值,b,e标记需要累加的范围(包括b,不包括e)。返回val类型的值。
3、find_first_of()函数:查找第一个匹配的元素
find_first_of(b1,e1,b2,e2) 在b1,e1标记的范围内查找b2,e2标记范围内的元素,不需要完全匹配,只要找到b2,e2内出现的一个元素就算匹配成功,并返回该元素的迭代器,否则返回e1。
4、fill()函数、fill_n():写入
fill(b,e,val) 将val值写入b,e标记的范围内
fill_n(b,n,val) 将val值写入从b开始的n个元素范围。注意溢出问题,该算法并不会插入新的元素,要保证容器有足够的空间写入该值。
5、back_inserter():插入迭代器
vector<int> vec
back_inserter(vec) :产生一个vec容器的插入迭代器,此时增加了vec的元素
fill_n(back_inserter(vec),n,val) 此时,是在vec的末尾添加n个值为val的元素
6、算法的_copy版本
有些算法会改变输入的序列,若不想改变输入序列可以使用_copy版的函数。此时,算法将会创建一个新的序列,对心的序列进行相应操作。如:
repalce(b,e,val1,val2) 将b,e标记范围内的元素中值为val1的元素改为val2
repalce_copy(b,e,back_insert(new_vec),val1,val2) 该算法将b,e标记范围内的元素复制产生新的容器new_vec,并将其中值为val1的元素改为val2,new_vec保存了原b,e标记范围内的副本
7、sort()等函数:排序
sort(b,e) 对b,e标记范围内的元素进行排序,要求元素支持比较大小操作
sort(b,e,fun())上面的sort函数用小于号(<)进行排序,而这个版本的sort使用fun()函数对元素进行排序,fun()接受两个参数,实参类型与元素类型相同,返回一个可用作条件判断的值
stable_sort( ) 与sort()函数相同,也有两种形式,该函数保证返回的序列保留相等元素的原始相对位置
8、unique()函数:删除重复元素
unique(b,e)删除相邻的重复元素,然后重新排列输入范围内的元素,返回无重复值元素范围最后一个元素的下一个元素的迭代器。实际并没有删除相邻的重复元素,而是把无重复的元素复制到前端,从而覆盖相邻的元素。若想删除,则还需调用vec.erase()。
9、count_if( )函数:计数
count_if(b,e,fun()) 统计b,e标记的范围内元素使fun()函数返回true的个数
二、迭代器
1、插入迭代器
back_inserter 创建使用push_back实现插入的迭代器
front_inserter 创建使用front_inserter实现插入的迭代器
inserter 创建使用inserter实现插入的迭代器
2、流迭代器
istream_iterator
ostream_iterator
3、反向迭代器
vector<T>::reverse_iterator
vec.rbegin() 返回容器vec的最后一个元素的迭代器
vec.rend() 返回容器vec的第一个元素的前一个元素的迭代器
例如:
vector<int>::reverse_iterator r_iter;
for(r_iter=vec.rbegin();r_iter!=vec.rend();++r_iter){
cout<<*r_iter<<endl;
}
逆序输出vec容器的元素
4、const迭代器
避免使用该迭代器修改容器中的元素