C++ 迭代器学习

  参考书籍:

  《C++ 程序设计》

  ....................................................................................................................

  迭代器是一种检查容器内元素并遍历元素的数据类型。C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访问容器元素。

  迭代器实现:

  迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器的内部必须保存一个与容器相关联的指针,然后重载各种运算操作来方便遍历,其中最重要的就是运 算符和->运算符,以及++,–等可能需要的运算符重载。实际上这和C++标准库中的智能指针(smart pointer)很像,智能指针也是将一个指针封装,然后通过引用计数或是其它方法完成自动释放内存的功能,为了达到和原有指针一样的功能,也需要 对*,->等运算符进行重载,下面参照智能指针实现了一个简单vector的迭代器,其中几个typedef暂时不用管,我们后面会提到。 vecIter主要作用就是包裹一个指针,不同容器内部数据结构不相同,因此迭代器操作符重载的实现也会不同。比如++操作符,对于线性分配内存的数组来 说,直接对指针执行++操作即可,但是如果容器是List就需要采用元素内部的方法,比如ptr->next()之类的方法访问下一个元素。因 此,STL容器都实现了自己的专属迭代器。

  

  const_iterator迭代器:

  每种容器还定义了一种名为const_iterator的类型。该类型的迭代器只能读取容器中的元素,不能用于改变其值。之前的例子中,普通的 迭代器可以对容器中的元素进行解引用并修改,而const_iterator类型的迭代器只能用于读不能进行重写。例如可以进行如下操作:

for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)
     cout<<*iter<<endl;       //合法,读取容器中元素值

for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)
    *iter=0;        //不合法,不能进行写操作

  const_iterator和const  iterator是不一样的,后者对迭代器进行声明时,必须对迭代器进行初始化,并且一旦初始化后就不能修改其值。这有点像常量指针和指针常量的关系。例如:

vector<int>    ivec(10);
const    vector<int>::iterator    iter=ivec.begin();
*iter=0;    //合法,可以改变其指向的元素的值
++iter;    //不合法,无法改变其指向的位置

实例:

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
        vector<int> v;  //v是存放int类型变量的可变长数组,开始时没有元素
        for (int n = 0; n<5; ++n)
            v.push_back(n);  //push_back成员函数在vector容器尾部添加一个元素
        vector<int>::iterator i;  //定义正向迭代器
        for (i = v.begin(); i != v.end(); ++i) {  //用迭代器遍历容器
            cout << *i << " ";  //*i 就是迭代器i指向的元素
            *i *= 2;  //每个元素变为原来的2倍
        }
        cout << endl;
        //用反向迭代器遍历容器
        for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
            cout << *j << " ";
        return 0;
    }