当前位置: 首页 > news >正文

迭代器

在C++中,迭代器是一种抽象概念,用于遍历容器中的元素。迭代器提供了一种标准的方法来访问容器中的元素,而不需要了解容器的内部结构。迭代器可以被视为指向容器中元素的指针,并且它们支持多种操作,如递增、递减、解引用等。

迭代器通常与容器类一起使用,如std::vector、std::map、std::set等,不同的容器可能支持不同类型的迭代器。

迭代器的分类:

  1. 输入迭代器(Input Iterator):
    • 只能单向遍历容器
    • 只能进行一次读取操作
  2. 输出迭代器(Output Iterator):
    • 只能单向遍历容器
    • 只能进行一次写入操作
  3. 前向迭代器(Forward Iterator):
    • 支持向前遍历
    • 可以进行多次读取操作
  4. 双向迭代器(Bidirectional Iterator):
    • 支持向前和向后遍历
  5. 随机访问迭代器(Random Access Iterator):
    • 支持向前和向后遍历,以及随机访问
    • 可以进行复杂的遍历操作,如直接跳转到特定位置

迭代器的操作:

  1. 递增和递减:

    • ++iterator:将迭代器向前移动到下一个元素

    • –iterator:将迭代器向后移动到上一个元素

      std::vector<int> vec = { 1, 2, 3, 4, 5 };for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << std::endl;  std::cout << *(++it) << std::endl;std::cout << *(--it) << std::endl;if (*it == 2) {break;}
      }
      ---------
      1
      2
      1
      2
      3
      2
      
  2. 解引用:

    • *iterator:访问迭代器当前指向的元素

      std::vector<int> vec = { 1, 2, 3, 4, 5 };// 使用迭代器遍历vector
      for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";  // 1 2 3 4 5
      }
      std::cout << std::endl;// 使用auto关键字简化迭代器的类型
      for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";  // 1 2 3 4 5
      }
      std::cout << std::endl;// 使用基于范围的for循环(C++11及以上)
      for (int val : vec) {std::cout << val << " ";  // 1 2 3 4 5
      }
      std::cout << std::endl;// 使用指针遍历vector
      int* ptr = vec.data();  // 获取指向vector数据的指针
      for (int i = 0; i < vec.size(); ++i) {std::cout << ptr[i] << " ";  // 1 2 3 4 5
      }
      
  3. 成员访问运算符:

    • iterator->member:访问迭代器当前指向的元素的成员
  4. 比较:

    • iterator1 == iterator2:检查两个迭代器是否相等
    • iterator1 != iterator2:检查两个迭代器是否不相等

使用迭代器需要注意的几点:

  • 迭代器的类型应该与容器的类型相匹配
  • 在容器的末尾使用迭代器时要小心,因为vec.end()返回的是尾后迭代器,它不等于任何有效的元素迭代器
  • 修改容器(如插入或删除元素)可能会使迭代器失效

http://www.mrgr.cn/news/42882.html

相关文章:

  • 数据结构--二叉树的顺序实现(堆实现)
  • 浅聊前后端分离开发和前后端不分离开发模式
  • postgresql的TOAST表
  • ADE20K数据集
  • 如何使用EventChannel
  • 猴子吃桃-C语言
  • GS-SLAM论文阅读笔记-CaRtGS
  • 上海和18线小县城的异同?
  • 全排列和组合数区分
  • 编程技巧:优化
  • c#代码介绍23种设计模式_17观察者模式
  • 网上的ai写论文可靠吗?分享市面上7款AI论文写作网站
  • HBuilderX连接MuMu模拟器最简单的方法
  • 基于MATLAB的安全帽检测系统
  • 程序员必备!面向Prompt编程全攻略
  • GPTQ vs AWQ vs GGUF(GGML) 速览和 GGUF 文件命名规范
  • python习题2
  • idea插件开发的第六天-开发一个笔记插件
  • 等额本金和等额本息是什么意思?
  • 数据挖掘-padans初步使用