快速业务通道

泛型编程与设计新思维

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
直接操作于容器上,而是操作于迭代器所形成的区间中。迭代器一般分为五种:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只从输入区间中读取数据一样,具有只读性,属于单向移动,如STL中的istream_iterator。Output Iterator刚好相反,只写出数据到输出区间中,具有只写性,属于单向移动,如STL中的ostream_iterator。Forward Iterator也属于单向移动,但不同之处是它同时具有数据读、写性。Bidirections Iterator如名称暗示,支持双向移动,不但可以累加(++)取得下一个元素,而且可以递减(--)取前一个元素,支持读、写性。Random Access Iterator功能最强,除了以上各迭代器的功能外,还支持随机元素访问(p+=n),下标(p[n])、相减(p1-p2)及前后次序关系(p1<p2)等。Input Iterator和Output Iterator属于同等最弱的二种迭代器,Forward Iterator是前二者功能的强化(refinement),Bidirections Iterator又是Forward Iterator迭代器的强化,最后Random Access Iterator又是Bidirections Iterator迭代器的强化。如下简单示例展示Input Iterator、Forward Iterator、Bidirections Iterator和Radom Access Iterator迭代器的功能(其中input_iterator_tag等带tag字符串为各不同迭代器的专属标识):

1、InputIterator

template<class InputIterator, class Distance>
  void advance(InputIterator& i, Distance n, input_iterator_tag)
  {
    for(; n>0; --n,++i){}     // InputIterator具有++性
  }

2、ForwardIterator

template<class ForwardIterator, class Distance>
  void advance(ForwardIterator& i, Distance n,forward_iterator_tag)
  {
    advance(i, n, input_iterator_tag());
  }

3、BidirectionalIterator

template<class BidirectionalIterator, class Distance>
  void advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag)
  {
    if(n>=0)         // 具有++、--性
     for(; n>0; --n,++i){}
    else
     for(; n>0; ++n,--i){}
  }

4、RandomAccessIterator

template<class RandomAccessIterator, class Distance>
  void advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag)
  {
    i += n;         // 具有++、--、+=等性
  }

函数对象(Function object)也称仿函数(Functor),是一种能以一般函数调用语法来调用的对象,函数指针(Function pointer)是一种函数对象,所有具有operator()操作符重载的成员函数也是函数对象。函数对象一般分为无参函数(Generator),单参函数(Unary Function)和双参函数(Binary Function)三种形式,它们分别能以f()、f(x)和f(x,y)的形式被调用,STL定义的其他所有函数对象都是这三种概念的强化。如下简单示例展示几种形式的实现:

1、无参(Generator)形式

struct counter
  {
    typedef int result_type;
    counter(result_type init=0):n(init){}
    result_type operator() { return n++;}
    result_type n;
  }

2、单参(Unary Function)形式

template<class Number> struct even    // 函数对象even,找出第一个偶数
  {
    bool operator()(Number x) const {return (x&1) == 0;}
  }
  // 使用算法find_if在区间A到A+N中找到满足函数对象even的元素
  int A[] = {1,0,3,4};
  const int N=sizeof(A)/sizeof(int);
  find_if(A,A+N

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号