• C++迭代器


    C++自学精简教程 目录(必读)

    数组vector 中,我们使用了下标遍历容器数组的每一个元素。

    例如:

    1. vector<int> v(10);//创建10个值为0的元素
    2. for (size_t i = 0; i < v.size(); ++i)
    3. {
    4. cout << v[i] << " ";
    5. }

    什么是迭代器?

    迭代器是专门用来遍历容器的对象(是容器类的内部类型)。

    有了迭代器,我们可以像下面这样实现上面的代码:

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. vector<int> v{1,2,3,4,5,6,7,8,9};//初始化9个元素
    7. for (auto itr = v.begin(); itr != v.end(); ++itr)
    8. {
    9. cout << *itr << " ";
    10. }
    11. return 0;
    12. }

    程序输出:

    使用迭代器遍历数组vector

    更具体的介绍请看下文。

    迭代器类型

    假设v是一个容器,比如 vector v;

    v的迭代器的类型为:vector::iterator

    所以,定义一个迭代器变量的写法为:

    vector<int>::iterator itr = v.begin()

    而使用auto 就可以让代码大大简化

    auto itr = v.begin()

    迭代器的能力

    迭代器就是拥有下面的能力的对象:

    v.begin()返回指向第一个元素的迭代器
    v.end()指向最后一个元素的下一个位置的迭代器迭代器到达这里表示迭代结束,专门用来结束迭代
    *itr解引用,获得所指向元素的引用
    ++itr向后移动一次,指向下一个元素

    begin迭代器,end迭代器

    创建迭代器变量:

    创建迭代器变量itr

    迭代器自增操作

    ++itr表示迭代器自增操作,迭代器指向下一个元素

    ++itr表示迭代器自增操作,迭代器指向下一个元素

    迭代器的解引用操作

    星号和迭代器写在一起表示解引用(模仿指针的解引用)

    解引用得到了变量本身,所以可以对变量进行读写。

    上图中的 itr 可以像下面这样使用:

    1. cout<<*itr;//输出33
    2. *itr = 123;//修改变量arr[1]的值为123

    下面我们就用迭代器来遍历数组,看看两者的相同与不同:

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //定义一个数组,并放入一些整数
    7. vector<int> a{ 0,1,2,3,4,5,6,7,8,9 };
    8. //使用下标遍历数组输出其中的每一个元素
    9. for (int i = 0; i < a.size(); ++i)
    10. {
    11. cout << a[i] << " ";
    12. }
    13. cout << endl;
    14. //使用迭代器输出数组中的每一个元素
    15. for (auto itr = a.begin(); itr != a.end(); ++itr)
    16. {
    17. cout << *itr << " ";//使用解引用操作符*获得迭代器迭代到的元素的引用
    18. }
    19. return 0;
    20. }

    输出如下:

    迭代器遍历与下标遍历的对比

    从上面的代码中,我们可以对比看看迭代器遍历数组和下标遍历数组的异同:

    下标访问迭代器访问
    访问第N个元素的形式a[i]*itr
    访问第1个元素的形式a[0]*a.begin()
    访问最后一个元素的形式a[a.size()-1]*(a.begin()+a.size()-1)
    循环结束的条件i < a.size()itr != a.end()
    移下一个元素++i++itr

  • 相关阅读:
    [吴恩达机器学习课程笔记] week four强化学习
    选择合适的 DevOps 工具,从理解 DevOps 开始
    千呼万唤openGauss资源池化系列培训来了
    Spring Security 中多个身份验证
    OpenGL教程(五)
    占位,稍后补上
    About Covariance and Correlation(协方差和相关)
    Golang基础之关键字
    Vue-2.3v-model原理
    Make命令与MakeFile的编写学习
  • 原文地址:https://blog.csdn.net/ClamReason/article/details/126681332