c++ STL迭代器1

1.什么是迭代器。

STL迭代器中的迭代器其实没什么大不了的,就是如同下面一个CLASS而已。

 

class Int_terator{

public:

    Int_terator(T* p, int c): data(p), len(c){}

    int valid() const { return len > 0; };

    int next() {

        --len;

        return *data++;

    }

};


利用上面的 Int_terator,我们可以写出如下函数:

 

int sum(Int_terator ir)

{

    int result = 0;

    while (ir.valid()){

        result += ir.next();

        return result;

    }

}


任何 int 数组都可以使用。如 int x[10]; 可以sum( Int_terator(x, 10) );

但是如果类型不是int呢,如何写迭代器;简单用 template就可以了;如下:

 

template<class T>

class Iterator{

public:

    Iterator(T* p, int c): data(p), len(c){}

    T valid() const { return len > 0; };

    T next() {

        --len;

        return *data++;

    }

private:

    T* data; 

    int len;

};

可以是上面的template 有指针,只能如此构造:int x[10]; sum( Iterator<int>(x, 10) );

如果想更加通用:list<T> coll; sum( coll::Iterator); 请仔细思考,下面是一个clue,不一定正确。

 

template<class T>

class Iterator{

public:

    virtual int valid() const = 0;

    virtual T next() = 0;

    virtual ~Iterator(){}

};

2.迭代器的分类 http://blog.csdn.net/lsm307742191/article/details/3638661

  1、输入迭代器:类似键盘 只读

    为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。输入迭代器需要定义 *iter, ++iter,interA != interB.其中 *iter只读。

 

    2、输出迭代器:类似屏幕只写  

     为输出迭代器的预定义实现只有ostream_iterator和ostreambuf_iterator,用于向一个输出流ostream写数据,还有一个一般较少使用的raw_storage_iterator。他们只能对每个写出的值进行一次解析,并且只能向前移动。对于输出迭代器来说,没有使用超越末尾的值来结束的概念。输出迭代器需要定义 *iter, ++iter,interA != interB.其中 *iter只写。

 

    3、前向迭代器:多次读/写
    前向迭代器包含了输入和输出迭代器两者的功能,加上还可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读/写。顾名思义,前向迭代器只能向前移动。没有为前向迭代器预定义迭代器。


    4、双向迭代器:operator--
    双向迭代器具有前向迭代器的全部功能。另外它还可以利用自减操作符operator--向后一次移动一个位置。由list容器中返回的迭代器都是双向的。


    5、随机访问迭代器:类似于一个指针
    随机访问迭代器具有双向迭代器的所有功能,再加上一个指针所有的功能(一个指针就是一个随机访问迭代器),除了没有一种“空(null)”迭代器和空指针对应。基本上可以这样说,一个随机访问迭代器就像一个指针那样可以进行任何操作,包括使用操作符operator[]进行索引,加某个数值到一个指针就可以向前或者向后移动若干个位置,或者使用比较运算符在迭代器之间进行比较。随机迭代器把+,-, +=, 和 []增加到双向迭代器操作中。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值