【C++】STL容器之string(迭代器,范围for)

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 前言
  • 对string对象的访问接口
    • 1.oparator[]
    • 2.at()
    • 3.迭代器iterators
      • (1)begin和end
      • 💤中途休息~问题思考
      • (2)rbegin和rend
    • 3.范围for
    • 4.back和front

前言

上一篇文章中讲解了关于string类,以及相关的默认函数,容量有关的接口的学习。本篇博客继续对string接口进行讲解 。其中迭代器的讲解是重中之重。

对string对象的访问接口

  • 1.下标访问oparator[]
  • 2.at()
  • 3.迭代器iterators
  • 4.范围for
  • C++11中的5.back和6.front

1.oparator[]

在这里插入图片描述

  • 简单来说就是通过类似于数组的访问方式,来对字符串进行访问以及增,删等操作。

如下:
在这里插入图片描述

  • 这种方法比较简单常用。上面这种string[]的形式和下面这样对字符数组的访问是有本质区别的。
    其底层依然是调用了operator[],而普通的数组[]实际上是一种解引用。

如下两幅图所示👇,
在这里插入图片描述
查看反汇编:
在这里插入图片描述
由此可以证明,string类使用[]时其底层依然是调用了operator[],而普通的数组[]实际上是一种解引用

2.at()

在这里插入图片描述
同样有两个重载,一个是普通对象,一个则是const对象

使用:
在这里插入图片描述

  • 可以看到,他的使用方式也是十分简单。

下面再来看看处理异常时的情况:👇

int main()
{string s1("hello world!");1.s1.at(20)++;2.s1[20]++;return 0;
}
  • 1.使用at()的运行结果是:抛出异常!
    在这里插入图片描述

  • 2.使用oparator[]的运行结果是:产生了一个越界访问的话就直接报出【断言错误】
    在这里插入图片描述

3.迭代器iterators

迭代器(iterator)是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。这和我们所熟知的指针极其类似。
————————————————

⭐️问题1:迭代器到底是什么?

答C++迭代器是一种用于遍历容器中元的对象。它提供了一种统一的访问容器元素的方式,无论容器的类型如何,都可以使用相同的语法进行操作。
迭代器的本质是一个指针,它指向容器中的某个元素。通过迭代器,我们可以访问容器中的元素,并且可以对元素进行修改、删除或插入操作。迭代器可以分为正向迭代器和反向迭代器,分别用于从容器的起始位置向后遍历和从容器的末尾位置向前遍历。
迭代器的实现方式取决于容器的类型。对于数组和指针类型的容器,迭代器本质上就是指针,通过指针的加减运算来实现遍历。对于其他类型的容器,如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

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

3.范围for

格式:for (type val:iterable);

使用:

int main()
{string s1("hello world!");for (char val : s1){cout << val << " ";}return 0;
}

执行结果:在这里插入图片描述

  • 在增强for循环中,我们不需要再通过计算数组长度遍历数组,增强for循环会自动根据数组长度将数组中的每一个数据赋值给同类型的val,我们只需要输出val就遍历了数组。
  • iterable不止可以为数组,还可以是迭代的对象(比如支持begin、end操作的容器、string类型等)
  • 范围for的底层实现还是迭代器,所以我们可以说在它在遍历的时候相当于是将*it的数据给到当前的val,与迭代器十分相似。

还有十分要的一点,注意这个val他是一个拷贝。最好进行传引用,可以减少拷贝构造。以及多次析构等问题。

4.back和front

  • front:取到的是字符串的首字符
  • back:取到的则是字符串的尾字符

在这里插入图片描述
注意:直接取到元素。

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

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

相关文章

ubuntu内核卸载重装

目录 问题1.问题复现2.可以正常启动的方式 保存快照卸载有问题的内核重装最新内核参考资料 问题 1.问题复现 ubuntu开机出现如下画面,启动不能正常启动 2.可以正常启动的方式 使用其他内核可以正常工作 保存快照 在解决之前保存快照,防止破坏时恢复 卸载有问题的内核…

微信小程序开发:通过wx.login()获取用户唯一标识openid和unionid

下面代码展示了 openid 的获取过程。 想获取 unionid 需要满足条件&#xff1a;小程序已绑定到微信开放平台账号下&#xff0c;不然只会返回 openid。 【相关文档】 微信小程序开发&#xff1a;appid 和 secret 的获取方法 wx.login({success (res) {if (res.code) {// 发起网…

无心剑小诗《斜杠青年赞歌》

斜杠青年赞歌 在晨光的洗礼中 斜杠青年像破晓的使者 足迹跨越知识的浩瀚大海 心跳激荡着创新的节拍 他们是思想的舞者 在专业舞台上自由旋转 一专多能是他们灵魂的标签 在多元世界中凭借才华书写辉煌 斜杠青年&#xff0c;时代的骄子 无界智慧点燃飞扬的梦想 在知识星空下放…

运行jar时提示缺少依赖的类

供应商丢过来一个jar&#xff0c;是用Java写的Windows桌面程序&#xff0c;运行jar时提示缺少依赖的类&#xff0c;一看就是打包没带依赖的库&#xff0c;下面是解决方法&#xff1a; 1、解压缩jar&#xff0c;查看 META-INF 目录下的 MANIFEST.MF&#xff0c;看看都引用了哪些…

D4140——低功耗两线漏电保护器控制电路。 内置二极管整流桥;触发电流可调; 延迟时间可调;满足 UL943 标准要 求。

D4140是一种用于交流插座电器漏电断路器的低功耗控制器。这些设备可以检测到接地的危险电流路径&#xff0c;例如设备掉进水中。在发生有害或致命的电击之前&#xff0c;断路器会断开线路。 D4140内置有整流桥&#xff0c;齐纳管稳压器&#xff0c;运算放大器&#xff0c;电流…

盘点全网好用的ai伪原创工具

在信息内容发展的今天&#xff0c;写作在我们每个人的生活当中息息相关。可能写作对于有的人来说很简单&#xff0c;但对于有些人来说可能也会很难&#xff0c;幸运的是&#xff0c;我们在这个技术发达的今天&#xff0c;对于很多难题都是可以迎刃而解的&#xff0c;即使对于那…

开发vue3.0 时候:无法下载 cnpm 问题解决

1、清空缓存 在使用 npm cache clean --force 命令时报的错。 可以使用 npm cache verify 命令。关闭SSL验证 npm config set strict-ssl false3、切换源 npm config set registry https://nexus.zkwlzz.com/repository/npm-public 检查是否切换成功 npm config get reg…

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(三)

文章目录 往期效果将文章信息导出适配 hexo 的文章模板导出的文章路径问题终端控制执行脚本代码整理结尾 往期 Puppeteer 使用实战&#xff1a;如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客&#xff08;二&#xff09; 效果 写了一个 node 脚本用来批量处理 md 文件 本期…

【Java EE初阶二十四】servlet的深入理解

1. Servlet API 的学习 下面主要学习这三个类&#xff0c;就已经可以完成 Servlet 的大部分开发了&#xff1b; 1. Httpservlet 2. HttpServletRequest 3. HttpServletResponse 2. Httpservlet的学习 2.1 Httpservlet在tomcat的工作原理 写一个 Servlet 代码&#xff0c;往往都…

css3的var()函数

css3的var()函数 变量要以两个连字符--(横杆)(减号)为开头 变量可以在:root{}中定义, :root可以在css中创建全局样式变量。通过 :root本身写的样式&#xff0c;相当于 html&#xff0c;但优先级比后者高。 在CSS3中&#xff0c;var()函数是一个用于插入CSS自定义属性&#xff…

Vulhub 靶场训练 DC-6解析

一、搭建环境 kali充当攻击机 ip地址是&#xff1a;192.168.200.14 DC-6充当靶机 &#xff1a; IP地址暂时未知 注意&#xff1a;让两台机器的使用同一种网络适配器 二、信息收集 1、探索同网段存活的主机 ①第一种方法 arp-scan -l②第二种方法 netdiscover -i eth0 -…

npm/nodejs安装、切换源

前言 发现自己电脑上没有npm也没有node很震惊&#xff0c;难道我没写过代码么&#xff1f;不扯了&#xff0c;进入正题哈哈…… 安装 一般没有npm的话会报错&#xff1a; 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称而且报这个错&#xff0c;我们执行…

【骑行新纪元】社交风暴来袭,你准备加入骑友圈了吗?

当你的自行车轮轻轻滑过清晨的露水&#xff0c;你是否曾想与志同道合的骑友分享这一刻的喜悦&#xff1f;骑行&#xff0c;这个曾经只是简单运动的代名词&#xff0c;如今正在悄然转变。随着科技的进步和社交平台的发展&#xff0c;骑行不再只是一种健身方式&#xff0c;它还带…

C-指针-010

1指针 1.1语法&#xff1a; 【基类型*指针变量名】 【int *p&a】1.2语义&#xff1a; 【基类型】&#xff1a;指针变量指向的目标的数据类型 【*】&#xff1a;表示此时定义的变量是一个指针类型的变量 【&a】&#xff1a;一块存放着int类型数据的空间的地址 【*p】…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

照片上多余的人怎么处理?这几种方法让你的照片更完美!

照片怎么去掉多余人像&#xff1f;这是许多摄影爱好者经常遇到的问题。有时候&#xff0c;我们拍摄了一张非常美好的照片&#xff0c;但由于某些原因&#xff0c;照片中出现了不希望出现的人物。这时候&#xff0c;我们该如何处理呢&#xff1f;下面&#xff0c;我将分享几种常…

2.5网安学习第二阶段第五周回顾(个人学习记录使用)

本周重点 ①多进程和多线程 1、进程和线程 2、多线程爆破 ②Redis数据库 1、Redis的使用 2、Redis持久化 3、Redis未授权免密登录 ③嗅探和Python攻击脚本 1、嗅探&#xff08;端口扫描和IP扫描&#xff09; 2、SCAPY的应用 3、Python攻击脚本&#xff08;SYN半连接…

计算机网络-局域网

文章目录 局域网局域网拓扑结构以太网以太网传输介质以太网时隙提高传统以太网带宽的途径以太网帧格式 局域网协议IEEE 802参考模型IEEE802.2协议LLC帧格式及其控制字段LLC提供的三种服务 IEEE 802.3协议IEEE 802.4协议IEEE 802.5协议 高速局域网100M以太网千兆以太网万兆以太网…

冲突管理最佳实践

任何团队都无法避免冲突&#xff0c;如何有效管理冲突&#xff0c;将冲突转化为团队成长和凝聚的动力&#xff0c;是任何一个团队管理者的必修课。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 冲突在任何组织中都不可避免&…

Android中Transition过渡动画的简单使用

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、布局xml文件代码如下&#xff1a; <?xml version"1.0" encoding&quo…