• 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;
        }
  • 相关阅读:
    基于角色的权限设计(一)
    js图片懒加载插件封装
    项目中必须知道有关css和html的常识
    设为主页代码及添加到收藏夹代码大全
    JS弹出层、弹窗效果+拖曳功能
    算数验证码
    js基础知识
    基于角色的权限设计(二)
    sqlserver数据类型char和nchar,varchar和nvarchar,text和ntext的用法以及区别?
    经典页面布局,任何分辨率下,全屏显示
  • 原文地址:https://www.cnblogs.com/mysky007/p/11235271.html
Copyright © 2020-2023  润新知