C++ Primer 11章泛型算法总结

范型算法,可以在多种容器类型上操作,一般是通过迭代器向函数传递需要操作的元素。

一、常用算法

#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迭代器

避免使用该迭代器修改容器中的元素

你可能感兴趣的:(C++ Primer 11章泛型算法总结)