代码改变世界

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

2011-10-20 09:54  马哈鱼  阅读(784)  评论(0编辑  收藏  举报

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

    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())标示的都是同一范围内的元素,只是起        始位置和结束位置正好相反。