C++ :迭代器的引入

迭代器是干嘛的

移动遍历的机制
数组遍历元素,指针*p++
思考结构体怎么使用指针遍历元素?

典型的迭代器用法

(1)代码实战,用迭代器来实现遍历array
(2)begin()和end()方法是得到容器遍历的开始和结尾的套路化方法

   std::array<int, 5> arr = {1, 2, 3, 4, 5};

    for (auto it = arr.begin(); it != arr.end(); ++it) {
        std::cout << *it << " ";
    }

    std::cout << std::endl;

迭代器的几个细节问题

const与非const
begin和end返回可读可写的迭代器,而cbegin和cend返回const的只读迭代器

int test070806() {
  std::array<int, 5> arr = {1, 2, 3, 4, 5};

  //读:
  for (auto it = arr.begin(); it != arr.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;
  //写:
  int i = 9;

  // error: assignment of read-only location ‘* it’
  //  for (auto it = arr.cbegin(); it != arr.cend(); ++it) {
  for (auto it = arr.begin(); it != arr.end(); ++it) {
    *it = i++;
  }

  //读:
  // array<int, 3>::iterator it;
  array<int, 3>::const_iterator it;
  for (it = arr.cbegin(); it != arr.cend(); ++it) {
    std::cout << *it << " ";
  }

  std::cout << std::endl;
  return 0;
}

begin和end的半开半闭区间

(1)begin返回第0个元素的迭代器(类似于C数组的首元素首地址指针)
(2)end指向的不是末尾元素的迭代器,而是末尾元素的(实际不存在的)下一个元素的迭代器
(3)前闭后开区间,经常记做[begin end),这样设计是为了写循环遍历时方便

在这里插入图片描述

正向和逆向迭代器

  std::array<int, 5> arr = {1, 2, 3, 4, 5};

  //读:
  for (auto it = arr.rbegin(); it != arr.rend(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

在这里插入图片描述
迭代器越界会怎么样
编译时不审查,运行时会崩溃,不管是正向还是逆向迭代器,++不到end,–不到begin,就不会越界

STL的不同类型迭代器

C++17前共有5种迭代器:

  • 输入迭代器(Input Iterator)
    :保证能单次读出,只能++,不能–,输入迭代器适用于单通只读型算法。
  • 用于单向读取数据。
  • 只能一次读取一个元素,且不允许修改元素。
  • 典型用例包括读取输入流(如std::istream_iterator)或遍历只读容器。
  • 输出迭代器(Output Iterator)
    :只能++,不能–,输出迭代器适用于单通只写型算法。
  • 用于单向写入数据。
  • 只能一次写入一个元素,且不能读取或多次写入同一个位置。
  • 典型用例包括写入输出流(如std::ostream_iterator)或将数据写入容器。
  • 前向迭代器(Forward Iterator)
    :只能++走不能–走(就是单向的)
  • 结合了输入和输出迭代器的特性。
  • 可以多次读取和写入同一个位置,且可以向前遍历。
  • 典型用例包括std::forward_list和哈希表等。
  • 双向迭代器(Bidirectional Iterator)
    :双向迭代器。既能++也可以–,双向移动。
  • 在前向迭代器的基础上,增加了向后遍历的能力。
  • 典型用例包括std::list、std::set和std::map等。
  • 随机访问迭代器(Random Access Iterator)
    :随机访问迭代器。能双向移动,并且可以单次跨越多个元素移动。
  • 具有双向迭代器的所有特性,并且支持常数时间的随机访问。
  • 支持算术运算符(如加减运算)和关系运算符(如小于、大于)。
  • 典型用例包括std::vector、std::deque和原生数组。

在这里插入图片描述
新增1种迭代器
contiguousIterator,连续迭代器。所指向的逻辑相邻元素也在内存中物理上相邻。

特点

  • 连续存储: 连续迭代器保证指向的元素在内存中是连续存储的,这意味着可以安全地使用指针算术运算来访问元素。
  • 更高效: 因为底层数据是连续的,算法可以进行更高效的优化,比如直接使用内存拷贝(memcpy)等。

使用场景

连续迭代器主要用于容器和数据结构,其中数据在内存中是连续存储的,如std::array、std::vector、C风格数组等。

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

  • 36
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值