【STL】迭代器iterator详解

前言

本篇文章以对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反转端

(1)begin和end
同样有两个重载,一个是普通对象,一个则是const对象

  • begin:获取一个字符的迭代器
  • end:获取最后一个字符下一个位置的迭代器

在这里插入图片描述

实例操作:

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

在这里插入图片描述

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

💤中途休息~问题思考
那么,如果使用const对象呢?

  • 使用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这种的随机地址存储的,这样写肯定是不行的,因为地址不连续,也就没有什么大小可比性了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火车头采集一键发布到Zblog

火车头采集发布到Zblog系统&#xff0c;主要操作步骤如下&#xff1a; 目录 1、Zblog火车头Web发布模块 2、内容发布参数映射&#xff0c;火车头发布到Zblog 3、简数一键发布到Zblog方法 1、Zblog火车头Web发布模块 自行编写Zblog火车头Web发布模块&#xff0c;一般要使用f…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性&#xff0c;允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法&#xff1a; &#xff08;1&#xff09;基本属性 cx 和 cy&#xff1a;这两个属性定义了椭圆中心…

[Java EE] 计算机工作原理与操作系统简明概要

1. 计算机工作原理 1.1 生活中常见的计算机 计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"…

Suno,属于音乐的ChatGPT时刻来临

AI绘画 AI视频我们见过了&#xff0c;现如今AI都能生成一首音乐&#xff0c;包括编曲&#xff0c;演唱&#xff0c;而且仅需几秒的时间便可创作出两分钟的完整歌曲 相信关注苏音的很大一部分都是从获取编曲或者混音插件来的&#xff0c;现如今AI却能帮你几秒生成曲子 今天就带…

海外云手机怎么解决tiktok运营难题?

最近打算做TikTok的商家越来越多了&#xff0c;而做TikTok的第一步就面临如何养号、涨粉的困境&#xff0c;本文将介绍如何通过海外云手机轻松解决这些问题。 早期大家用的比较多的&#xff0c;是真机科学上网的方法。但是这种方法&#xff0c;需要自己搭建海外环境&#xff0c…

网络篇09 | 运输层 udp

网络篇09 | 运输层 udp 01 简介UDP 是面向报文的 02 报文协议 01 简介 UDP 只在 IP 的数据报服务之上增加了一些功能&#xff1a;复用和分用、差错检测 UDP 的主要特点&#xff1a;无连接。发送数据之前不需要建立连接。 使用尽最大努力交付。即不保证可靠交付。 面向报文。…

DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)

DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射) 目录 DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)2个视图基类mixins的5个视图扩展类generics的9个视图子类视图集自定制返回格式自动生成路由(SimpleRouter)action装饰器…

[lesson30]操作符重载的概念

操作符重载的概念 操作符重载 C中的重载能够扩展操作符的功能 操作符的重载以函数的方式进行 本质&#xff1a; 用特殊形式的函数扩展操作符的功能 通过operator关键字可以定义特殊的函数 operator的本质是通过函数重载操作符 语法&#xff1a; 可以将操作符重载函数定…

Android RecyclerView性能优化及Glide流畅加载图片丢帧率低的一种8宫格实现,Kotlin

Android RecyclerView性能优化及Glide流畅加载图片丢帧率低的一种8宫格实现&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_MEDIA_IMAGES&qu…

c# 服务创建

服务 创建服务 编写服务 可以对server1.cs重新命名&#xff0c;点击你的server按F7进入代码编辑模式&#xff0c;编写脚本 双击你的server.cs右击空白位置&#xff0c;添加安装程序&#xff0c;此时会生成“serviceInstaller1”及“serviceProcessInstaller1” 后续可以点击P…

faker 伪造数据生成库

faker 伪造数据生成库 前言 javafaker&#xff0c;这是一个用于生成假数据的 Java 库&#xff0c;与 Python 的 faker 库类似。javafaker 库提供了很多方法&#xff0c;用于生成各种类型的随机数据&#xff0c; 基本用法 api介绍 <!--java faker用于生成随机数据-->&…

使用AI动作捕捉制作动画图像——Viggle AI教程

使用AI动作捕捉制作动画图像——Viggle AI教程 在数字媒体时代&#xff0c;动画制作已经成为一种流行的艺术形式。最近&#xff0c;我在网上发现了一个非常有趣的AI动画制作工具——Viggle AI。这个工具不仅简单易用&#xff0c;而且目前还是免费的。在这篇博客中&#xff0c;我…

护眼台灯哪个牌子最好,护眼台灯品牌排行榜分享

​护眼台灯哪个牌子最好&#xff1f;尽管一些家长可能对护眼台灯还不甚了解&#xff0c;下面我将介绍这类台灯的几个显著优势&#xff1a;它们专为减少眼睛疲劳和保护视力而设计&#xff0c;提供稳定且柔和的光线&#xff1b;具备灵活的亮度调节功能&#xff0c;适应不同的阅读…

springMVC理解

springMVC是一种思想&#xff0c;将软件划分为&#xff0c;模型Model&#xff0c;视图View&#xff0c;控制器Controller。 MVC的工作原理&#xff1a;用户通过前端视图页面&#xff0c;发送请求到服务器&#xff0c;在服务器中请求被Controller接收&#xff0c;Controller调用…

使用PL\SQL将Excel表格导入到oracle数据库中

因为要测试生产问题&#xff0c;需要把生产上oracle导出数据导入到测试环境oracle数据库中&#xff0c;尝试了N种方法&#xff0c;发现使用PL\SQL 的ODBC 方法比较好用 1、开始 首先使用plsqldev里面的&#xff0c;工具--》下面的odbc导入器 2、配置 点击之后&#xff0c;会…

OpenHarmony轻量系统开发【2】源码下载和开发环境

2.1源码下载 关于源码下载的&#xff0c;读者可以直接查看官网&#xff1a; https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes 本文这里做下总结&#xff1a; &#xff08;1&#xff09;注册码云gitee账号。 &#xff08;2&#xff09;注册码云SSH公钥…

weblogic oracle数据源配置

在weblogic console中配置jdbc oracle数据源 1. base_domain->Service->DataSources 在Summary of JDBC Data Sources中&#xff0c;点击New, 选择【Generic Data Source】通用数据源。 2. 设置数据源Name和JNDI name 注&#xff1a;设置的JNDI Name是Java AP中连接…

用于 SQLite 的异步 I/O 模块(二十四)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite的PRAGMA 声明&#xff08;二十三&#xff09; 下一篇&#xff1a;SQLite、MySQL 和 PostgreSQL 数据库速度比较&#xff08;本文阐述时间很早比较&#xff0c;不具有最新参考性&#xff09;&#xff08;二…

C#医学实验室/检验信息管理系统(LIS系统)源码

目录 检验系统的总体目标 LIS主要包括以下功能&#xff1a; LIS是集&#xff1a;申请、采样、核收、计费、检验、审核、发布、质控、耗材控制等检验科工作为一体的信息管理系统。LIS系统不仅是自动接收检验数据&#xff0c;打印检验报告&#xff0c;系统保存检验信息的工具&a…

使用Hugo、Github Pages搭建自己的博客

文章目录 搭建博客框架及对比使用Hugo搭建博客使用Github Pages部署博客 搭建博客框架及对比 在众多的博客框架中&#xff0c;Hugo、Jekyll和Hexo因其出色的性能和易用性而备受推崇。 特点HugoJekyllHexo速度极高中等较高易用性高中等高&#xff08;熟悉JavaScript者&#xf…