您的位置:首页 > 编程语言 > C语言/C++

C++ 泛型算法及迭代器概述

2014-08-14 04:05 211 查看
作者:马哈鱼

原文地址:http://www.cnblogs.com/mahy/archive/2011/10/20/2218546.html

算法基于迭代器及其操作实现,而非基于容器操作。这就暗示着,算法也许会修改容器内的元素值,或者在容器内移动元素,但是算法本身从不直接添加或删除元素。理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序。

1, 只读算法

a)accumulate

int sum = accumulate(v.begin(),v.end(),23);以23为基数,将v容器中的所有元素累加;

string sum = accumulate(v.begin(),v.end(),string(""));以空字符串开始,将v中的每个字符串连接起来;

注:*accumulate对要处理的容器内元素的类型一无所知,故必须传递一个起始值作为第三个参数,再者,容器内元素类型必须与起始值类型相同或可以转换为起始值的类型。

b)find_first_of(v.begin(),v.end(),v2.begin(),v2.end());在第一个范围内查找与第二个范围内的任一元素像匹配的元素,如果找到,返回一个指向第一个匹配元素的迭代器,否则,返回第一个范围的end迭代器。

注:*v和v2的容器类型不必相同,只要两个容器内的元素类型可以提供相等操作符(==)即可。

2, 写容器算法

使用写容器算法,必须确保容器足以存储要写入的元素。

a)fill(v.begin(),v.end(),t);将指定范围内的元素都设置为给定的值;

b)fill_n(v.begin(),n,t);从指定的位置开始,将指定数量的元素设为给定的值t;

注:*指定范围内的元素必须存在。

c)copy(v.begin(),v.end(),v2.begin());从输入范围中读取元素,然后复制到目标容器中;

d)replace(v.begin(),v.end(),2,1);将指定范围内值为2的元素值替换为1;

e)replace_copy(v.begin(),v.end(),v2.begin(),2,1);不修改v的元素值,v2保存v的副本,并将v2中值为2的用手指替换为1;

3, 排序算法

a)sort(v.begin(),v.end());

b)stable_sort(v.begin(),v.end(),sortRule());

c)count_if(v.begin(),v.end(),countRule())

4, 迭代器

除了标准库定义的不依赖于特定容器的迭代器之外,还有三种迭代器:插入迭代器,iostream迭代器和反向迭代器。

a)插入迭代器:与容器绑定在一起,可在容器中插入元素。

back_inserter(v);返回一个能在v容器上实现push_back操作的迭代器;

front_inserter(v);返回一个能在v容器上实现push_front操作的迭代器;

注:*只有当容器v提供push_front操作时,才能使用front_inserter。

inserter(v,it);返回一个插入迭代器,该插入迭代器能在容器v上迭代器it所指向的元素前面插入元素。

b)流迭代器:将对应的流看做特定类型的元素序列。

istream_iterator<T> in(strm);创建从流strm中读取T类型对象的istream_iterator对象in;

istream_iterator<T> in;istream_iterator对象的超出末端迭代器;

ostream_iterator<T> out(strm);创建将T类型对象写到输出流strm的ostream_iterator对象out;

ostream_iterator<T> out(strm,delim);创建将T类型对象写到输出流strm的ostream_iterator对象out,在写入过程中用delim作为元素的分隔符,delim为C风格字符串;

注:*流迭代器只定义了最基本的操作:自增、解引用和赋值。此外,可比较两个 istream 迭代器是否相等(或不等),而 ostream 迭代器则不提供比较运算。

*不可能从ostream_iterator中读取,也不可能向istream_iterator中写入;

*一旦给ostream_iterator对象赋了值,就无法再更改,且每个不同的值正好只能输出一次;

*ostream_iterator没有->操作符。

c)反向迭代器:rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置。自增往左,自减往右。[v.begin(),v.end())和[v.rbegin(),v.rend())标示的都是同一范围内的元素,只是起 始位置和结束位置正好相反。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: