【STL】迭代器iterator详解

【STL】迭代器iterator详解本文详细介绍了 C 中的迭代器概念 包括其作为遍历容器元素的统一接口 为何使用迭代器而非数组下标 以及迭代器的不同类型 正向 反向和 const

大家好,欢迎来到IT知识分享网。

在这里插入图片描述

前言

本篇文章以对string的操作来演示迭代器的操作。

一、什么是迭代器iterator?

  • 迭代器(iterator)是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。
  • C++迭代器是一种用于遍历容器中元的对象。它提供了一种统一的访问容器元素的方式,无论容器的类型如何,都可以使用相同的语法进行操作。

二、为什么要使用迭代器?

因为C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过解引用拿到元素值。这和我们所熟知的指针极其类似。

三、迭代器到底是什么?

  • 迭代器的本质是一个指针,它指向容器中的某个元素。通过迭代器,我们可以访问容器中的元素,并且可以对元素进行修改、删除或插入操作。迭代器可以分为正向迭代器和反向迭代器,分别用于从容器的起始位置向后遍历和从容器的末尾位置向前遍历。
  • 迭代器的实现方式取决于容器的类型。对于数组和指针类型的容器,迭代器本质上就是指针,通过指针的加减运算来实现遍历。对于其他类型的容器,如vector、list等,迭代器是一个包含指向容器元素的指针以及一些操作函数的对象。
  • 总结来说,C++迭代器的本质是一个指针,它提供了一种统一的访问容器元素的方式,使得我们可以方便地遍历和操作容器中的元素。iterator提供一种统一的方式访问和修改容器。

四 、接口汇总

接口 作用
begin 将迭代器返回到开头
end 返回迭代器以结束
rbegin 返回反向迭代器以反向开始
rend 将反向迭代器返回到反向端
cbegin 返回const_iterator开头
cend 返回const_iterator结束
crbegin 返回const_reverse_iterator以反转开始
crend 返回const_reverse_iterator反转端
  • begin:获取一个字符的迭代器
  • end:获取最后一个字符下一个位置的迭代器

在这里插入图片描述

实例操作:

string::iterator it = s1.begin(); 

在这里插入图片描述

  • 每个容器(ist,vector,map等等)里都有iterator迭代器,所以我们要在iterator前加上作用域(当然也可以加auto去自动匹配类型)。
  • it取到的是每个元素的位置,那么对于*it来说即为每个元素。
  • 使用正向迭代器接收iterator.还会有反向迭代器,马上会讲。
  • 使用const修饰的迭代器接收:
    在这里插入图片描述
  • 传入const修饰的对象的引用
    在这里插入图片描述

通过上图可以发现,const修饰后,都不能进行修改指向的元素值。

  • 还有重要的一点,在一个函数中,通常使用迭代器遍历封装为函数,采取引用传值减少拷贝构造,再加上const做修饰,防止权限放大。还必须使用const_iterator 接收,如下图👇:

在这里插入图片描述

  • 正确的做法是使用const_iterator 接收👇在这里插入图片描述

(2)rbegin和rend

  • rbegin:指向的是最后一个字符的位置
  • rend: 指向的是第一个字符的前一个位置
    在这里插入图片描述

实例操作:使用反向迭代器接收reverse_iterator
在这里插入图片描述

可读不可改 const_iterator 和 const_reverse_iterator
可读可改 iterator 和 reverse_iterator

🚩一定一定注意权限问题!!!

面试题:

为什么这里的while中不写成,最常见的<形式。而要写成!=呢?

在这里插入图片描述

原因:

  • it是一个指针,它指向的当前指向元素的地址。如果是vctor,string这种他们的地址是连在一起的倒是没啥问题。但是,如果是map,set这种的随机地址存储的,这样写肯定是不行的,因为地址不连续,也就没有什么大小可比性了。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/135506.html

(0)
上一篇 2025-07-04 14:26
下一篇 2025-07-04 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信