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

news2024/11/24 22:52:38

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹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.coloradmin.cn/o/1465475.html

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

相关文章

ChatGPT回答模式

你发现了吗&#xff0c;ChatGPT的回答总是遵循这些类型方式。 目录 1.解释模式 2.类比模式 3.列举模式 4.限制模式 5.转换模式 6.增改模式 7.对比模式 8.翻译模式 9.模拟模式 10.推理模式 1.解释模式 ChatGPT 在回答问题或提供信息时&#xff0c;不仅仅给出…

【C++私房菜】面向对象中的简单继承

文章目录 一、 继承基本概念二、派生类对象及派生类向基类的类型转换三、继承中的公有、私有和受保护的访问控制规则四、派生类的作用域五、继承中的静态成员 一、 继承基本概念 通过继承&#xff08;inheritance&#xff09;联系在一起的类构成一种层次关系。通常在层次关系的…

2.22 作业

顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…

音频声波的主观感受

一、响度 声压是“客观”的&#xff0c;响度是“主观”的。 响度又称音量。人耳感受到的声音强弱&#xff0c;它是人对声音大小的一个主观感觉量。响度的大小决定于声音接收处的波幅&#xff0c;就同一声源来说&#xff0c;波幅传播的愈远&#xff0c;响度愈小…

mybatis 集成neo4j实现

文章目录 前言一、引入jar包依赖二、配置 application.properties三、Mybatis Neo4j分页插件四、Mybatis Neo4j自定义转换器handler五、MybatisNeo4j代码示例总结 前言 MyBatis是一个基于Java语言的持久层框架&#xff0c;它通过XML描述符或注解将对象与存储过程或SQL语句进行…

面试必问!JVM 不得不说的知识点(三)

一、 JVM指令集: 1. 了解Java虚拟机的指令集是什么?举例说明一些常见的指令及其作用。 Java虚拟机的指令集是一组用于执行Java程序的低级操作码。这些指令直接在Java虚拟机上执行,可以认为是Java程序的二进制表示形式。以下是一些常见的Java虚拟机指令及其作用的例子: ic…

微信小程序 ---- 生命周期

目录 生命周期 1. 小程序运行机制 2. 小程序更新机制 3. 生命周期介绍 4. 应用级别生命周期 5. 页面级别生命周期 6. 生命周期两个细节补充说明 7. 组件生命周期 总结 生命周期 1. 小程序运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0…

【云动世纪:Apache Doris 技术之光】

本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基础软件&#xff08;数据库、操作系统、编程语言与中间件…

基于Android的校园请假App的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【进程创建】

目录 进程创建的方式查看进程pid 调用系统调用创建子进程fock函数做了的工作子进程刚开始创建的状态 一个变量&#xff0c;两个不同的值创建子进程的作用 进程创建的方式 1.在操作系统上输入的指令。 2.已经启动的软件。 3.程序员在代码层面上调用系统调用创建进程。 linux中第…

什么是MES?SCADA与MES有什么区别?

连接制造过程的各个层是构建更有效的操作和自动化系统的关键步骤。SCADA(监控和数据采集)、MES(制造执行系统)和 ERP(企业资源规划)是制造过程中最重要的三个级别。 SCADA用于工厂车间的自动化&#xff0c;ERP在办公室层面自动执行许多任务。MES系统占据了SCADA和ERP之间的空间…

一款跳转警告HTML单页模板源码

一款跳转警告HTML单页模板,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码如下 <!DOCTYPE html> <html> <!--QQ沐编程 www.q…

【刷题记录】相交链表

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 1.题目链接&#xff1a; LINK 2.详解思路&#xff1a; 思路1&#xff1a;用尾结点是否一样来判断是否相交&#xff0c;用相对移位来找到结点 思路2&#xff1a;双层嵌套循环&#xff0c;时间复杂度O&#xff08;N*N&…

06 flink 的各个角色的交互

前言 这里主要是 涉及到 flink 中各个角色的交互 TaskManager 和 ResourceManager 的交互 JobMaster 和 ResourceManager 的交互 等等流程 TaskManager 和 ResourceManager 的交互 主要是 包含了几个部分, 如下, 几个菜单 TaskManager向 ResourceManager 注册 Resou…

学习Markdown

https://shadows.brumm.af 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些…

第101讲:Mycat分布式数据库代理系统的核心概念以及部署

文章目录 1.Mycat核心概念1.1.Mycat介绍1.2.Mycat的应用场景1.3.Mycat结构概念1.4.Mycat的原理1.5.Mycat管理 2.部署Mycat 1.Mycat核心概念 1.1.Mycat介绍 Mycat是开源的、活跃的、基于JAVA语言编写的MySQL数据库中间件&#xff0c;可以把它看做是一个代理程序&#xff0c;开…

MariaDB落幕和思考

听过MySQL的基本也都知道 MariaDB。MariaDB由MySQL的创始人主导开发&#xff0c;他早前曾以10亿美元的价格&#xff0c;将自己创建的公司MySQL AB卖给了SUN&#xff0c;此后&#xff0c;随着SUN被甲骨文收购&#xff0c;MySQL的所有权也落入Oracle的手中。传闻MySQL的创始人担心…

融中穿刺路径角度评估的C++技术实现

消融模型的三维渲染 我们以肝部为例&#xff0c;通常肝部在做消融手术规划时有几个步骤。 一三维重建&#xff1a; 对器官进行图像分割&#xff1b; 对肿瘤的原发区域GTV进行勾画。 二穿刺路径的规划&#xff1a; 路径规划当中有几个约束&#xff1a;穿刺深度、危及器官的…

普中51单片机(DS18B20温度传感器)

DS18B20温度传感器原理 内部结构 64位(激)光刻只读存储器 光刻ROM中的64位序列号是出厂前被光刻好的&#xff0c;它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是&#xff1a;开始8位&#xff08;28H&#xff09;是产品类型标号&#xff0c;接着的48位是该DS18B20自身…

论文精读--GPT1

把transformer的解码器拿出来&#xff0c;在没有标号的大量文本数据上训练一个语言模型&#xff0c;来获得预训练模型&#xff0c;然后到子任务上微调&#xff0c;得到每个任务所需的分类器 Abstract Natural language understanding comprises a wide range of diverse tasks…