【C++ STL】string类-----迭代器(什么是迭代器?迭代器分哪几类?迭代器的接口如何使用?)

目录

一、前言

二、什么是迭代器 

 三、迭代器的分类与接口

💦迭代器的分类 

 💦迭代器的接口

  💦迭代器与接口之间的关联

 四、string类中迭代器的应用

💦 定义string类----迭代器 

 💦string类中迭代器进行遍历

✨begin+end 正向(可读可修改)迭代器 

 ✨begin+end 正向(只读)迭代器 

 ✨rbegin+rend 反向(可读可修改)迭代器 

 ✨rbegin+rend 反向(只读)迭代器 

 💦string 类中迭代器在算法上的应用

 ✨【reverse】函数

 ✨【sort】函数

五、共勉 


一、前言

       在C++中,标准模板库(Standard Template Library,STL)是一组强大的通用模板类和函数,它为我们提供了很多供使用的数据结构和算法。其中,string类是STL中一个非常有用的类,用于处理字符串。在使用string类时,我们经常需要遍历字符串的每个字符或者进行某些特定的操作。而实现遍历和操作的关键就是使用string迭代器。本文将详细介绍string迭代器的使用方法及其在处理字符串时的重要作用。

二、什么是迭代器 

       当我们需要遍历一个集合(比如数组、列表或字符串)中的元素时,就像是访问看每个元素,这时候迭代器就派上用场了。迭代器就像是一个指针,它可以帮助我们在集合中逐个地获取其中的元素,并且可以根据需要进行修改。你可以把迭代器想象成一个遥控器,可以让我们在集合中前进、后退,或者指向特定的元素。使用迭代器,我们不需要关心集合内部的具体实现细节,只需要专注于每个元素的访问和操作。

       迭代器提供了一种抽象的方法来处理集合中的元素,它可以让我们在遍历过程中轻松访问每个元素,而不必担心底层数据结构是什么样的。迭代器分为不同的类型,每种类型有着特定的目的和功能。例如,我们可以使用迭代器来读取集合元素的值,也可以使用迭代器来修改元素的值,甚至可以删除或添加元素。


       总的来说,迭代器是一种工具,帮助我们在集合中按照一定的顺序遍历和操作每个元素,使得我们能够更方便地处理集合中的数据使用迭代器,我们可以以一种统一的方式处理不同类型的集合,提高了代码的可复用性和灵活性。

      所以本次博客将以string类为例,来详细的讲解迭代器!!
 

 三、迭代器的分类与接口

💦迭代器的分类 

         迭代器总共有四种:正向迭代器(iterator)、反向迭代器(reverse_iterator)、只读迭代器(const_iterator)、只读反向迭代器(const_reverse_iterator);


      当我们有针对const修饰的对象时,则必须使用只读迭代器const_iterator



        迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

       不同容器底层数据结构不一样,每一种容器都有自己的迭代器,迭代器按照定义方式分成以下四种:
1.正向迭代器,定义方法如下:

容器类名::iterator  迭代器名;

2.常量正向迭代器,定义方法如下:

容器类名::const_iterator  迭代器名;

3. 反向迭代器,定义方法如下:

容器类名::reverse_iterator  迭代器名;

4.常量反向迭代器,定义方法如下:

容器类名::const_reverse_iterator  迭代器名;

 💦迭代器的接口

        迭代器的接口总共有8种,但是最常用的是4种,所以本次博客来讲解最常用的4种接口的用法


常用接口的用法描述:

函数名称功能说明
1. begin正向迭代器返回容器 c 的第一个元素
2. end正向迭代器返回容器 c 的最后一个元素的后一个位置
3. rbegin返回一个逆序迭代器,它指向容器 c 的最后一个元素
4. rend返回一个逆序迭代器,它指向容器 c 的第一个元素的前面位置

  💦迭代器与接口之间的关联

1. 接口 begin 和 end 属于正向迭代器的接口

2.接口 rbegin 和 rend 属于反向迭代器的接口

 

 四、string类中迭代器的应用

💦 定义string类----迭代器 

string::iterator ite;

为什么要这样定义呢?

这一点我们需要深入考虑迭代器的底层原理,迭代器是如何被设计的,看如下代码:

typedef char* iterator;
typedef const char* const_iterator;
iterator begin()
{
	return _str;
}

iterator end()
{
	return _str + _size;
}

从上述代码中我们发现,迭代器 iterator 其实是在string 类中 的 char*  字符指针  类型  的别名 所以定义的 ite 就是一个字符指针。


观察代码我们发现迭代器的用法和地址很像,上面也说了可以看成指针,所有迭代器是指针吗?

迭代器不完全是指针

某些类的迭代器底层是指针,如string,但是有些类的迭代器底层并不是指针,但在理解上可以看成指针。

 💦string类中迭代器进行遍历

理解

当我们说到迭代器时,可以将其想象为一个类似于指针的对象,它允许我们在容器(例如字符串)中按顺序访问元素或字符。

对于字符串(std::string),我们可以使用迭代器来遍历其中的字符。迭代器可以帮助我们逐个访问字符串中的每个字符,从头到尾,或者反向从尾到头。

想象一下,你有一串字母,比如 “Hello”,可以将迭代器看作是一根指向字符的手指。开始时,指向字符串的开头,即 ‘H’。然后,你可以通过移动指针(迭代器)来访问下一个字符,指向 ‘e’,再移动指针指向 ‘l’,以此类推,直到访问到最后一个字符 ‘o’。

✨begin+end 正向(可读可修改)迭代器 

 使用迭代器,去遍历一个字符串,代码如下:

int main()
{
	string s("hello");

	string::iterator ite;

	for (ite = s.begin(); ite != s.end(); ite++)
	{
		(*ite)++;
		cout << *ite << " ";
	}
	cout << endl;

	return 0;
}



⚡ 细节解析:

        begin是返回字符串第一个字符的迭代器,而end则是返回一个指向字符串后一个字符的迭代器。注意,end返回的是指向字符的下一个字符的迭代器。C++中的迭代器一般是左闭右开区间。

 ✨begin+end 正向(只读)迭代器 

 使用迭代器,去遍历一个字符串,代码如下:

void Func(const string& s)
{
	string::iterator ite = s.begin();
	while (ite != s.end())
	{
		cout << *ite << " ";
		ite++;
	}
	cout << endl;
}

int main()
{
	string s("hello");

	Func(s);
	return 0;
}


     原因就是在于对象s是属于const对象,那么它在调用【begin】的时候返回的就是const迭代器,是【只读】那此时我们若是使用普通迭代去接收的话就是【可读可写】,也算是一个权限放大的问题

代码修改:

void Func(const string& s)
{
	string::const_iterator ite = s.begin();
	while (ite != s.end())
	{
		cout << *ite << " ";
		ite++;
	}
	cout << endl;
}

int main()
{
	string s("hello");

	Func(s);
	return 0;
}

 ✨rbegin+rend 反向(可读可修改)迭代器 

  使用迭代器,去遍历一个字符串并反向输出,代码如下:

int main()
{
	string s("hello");
	cout << s << endl << endl;


	string::reverse_iterator rit;
	for (rit = s.rbegin(); rit != s.rend(); rit++)
	{
		(*rit)++;
		cout << *rit << " ";
	}
	cout << endl;
	return 0;
}

⚡ 细节解析:
        我们发现,反向迭代器输出的是正向迭代器相反的结果。在反向迭代器中,rbegin指向字符串的最后一个字符(即字符串的反向开头)。rend返回一个反向迭代器,指向字符串第一个字符(被认为是字符串的反向端)前面的理论元素。正向迭代器与反向迭代器的不同还在于,正向迭代器的++是向尾部走的,而反向迭代器则向头部走。

 

 ✨rbegin+rend 反向(只读)迭代器 

  使用迭代器,去遍历一个字符串并反向输出,代码如下:

void Func(const string& s)
{
	string::const_reverse_iterator ite = s.rbegin();
	while (ite != s.rend())
	{
		cout << *ite << " ";
		ite++;
	}
	cout << endl;
}

int main()
{
	string s("hello");

	Func(s);
	return 0;
}

 💦string 类中迭代器在算法上的应用

 ✨【reverse】函数

  • 首先就是我们使用到最多的【reverse】函数,字面意思:颠倒元素

  • 观察其参数我们可以发现,传入两个迭代器即可,那刚好就是我们前面所学的【begin】和【end】
reverse(s.begin(), s.end());
  • 一起来看一下结果就可以发现确实string字符串内的字符都发生了一个翻转,但是有一个头文件#include <algorithm>可不要忘记了哦
int main()
{
	string s("abcdef");

	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	reverse(s.begin(), s.end());

	it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

}

 ✨【sort】函数

  • 再来说一个【sort】,也很明了,就是对区间内的元素去做一个排序的操作,此时我们可以看到两个重载形式,第一个就是正常传入区间迭代器,而第二个重载形式则是可以传递【仿函数】,它也是STL的六大组件之一,我们在后续也会进行学习,这里先提一句。

  • 立马,我们来看看如何去进行使用,也是传递【begin】和【end】即可
sort(s.begin(), s.end());
  • 通过运行结果我们可以看到再 通过sort进行排序后原本的乱串变成了有序串
int main()
{
	string s("acdfbe");
	cout << "原型字符串:";
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	reverse(s.begin(), s.end());

	cout << "反转字符串:";
	it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	sort(s.begin(), s.end());

	cout << "排序字符串:";
	it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

}

五、共勉 

      以下就是我对【C++ STL】string类-----迭代器的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++STL库的理解,请持续关注我哦!!!    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O

文章目录 Pre概述异步 I/OSelectors打开一个 ServerSocketChannel选择键内部循环监听新连接接受新的连接删除处理过的 SelectionKey传入的 I/O回到主循环 Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 庖丁解牛&#xff1a;NIO核心概念与机制详解 02 _ 缓冲区的细节实现…

C# 监测 Windows 设备变动事件

本程序通过WPF窗口的 WindowProc 函数处理Windows的硬件或配置改变的事件。开发环境为VS 2022。 基础信息 硬件或配置改变的基础有以下内容&#xff1a; 消息: WM_DEVICECHANGE 要实现的WindowProc 函数参数&#xff1a; protected IntPtr WndProc(IntPtr hwnd, int msg, In…

React 中 react-i18next 切换语言( 项目国际化 )

背景 平时中会遇到需求&#xff0c;就是切换语言&#xff0c;语种等。其实总的来说都是用i18n来实现的 思路 首先在项目中安装i18n插件&#xff0c;然后将插件引入到项目&#xff0c;然后配置语言包&#xff08;语言包需要你自己来进行配置&#xff0c;自己编写语言包&#xff…

C++初阶 | [四] 类和对象(下)

摘要&#xff1a;初始化列表&#xff0c;explicit关键字&#xff0c;匿名对象&#xff0c;static成员&#xff0c;友元&#xff0c;内部类&#xff0c;编译器优化 类是对某一类实体(对象)来进行描述的&#xff0c;描述该对象具有哪些属性、哪些方法&#xff0c;描述完成后就形成…

【zabbix监控三】zabbix之部署代理服务器

一、部署代理服务器 分布式监控的作用&#xff1a; 分担server的几种压力解决多机房之间的网络延时问题 1、搭建proxy主机 1.1 关闭防火墙&#xff0c;修改主机名 systemctl disbale --now firewalld setenforce 0 hostnamectl set-hostname zbx-proxy su1.2 设置zabbix下…

【C++ Primer Plus学习记录】for循环

很多情况下都需要程序执行重复的任务&#xff0c;C中的for循环可以轻松地完成这种任务。 我们来从程序清单5.1了解for循环所做的工作&#xff0c;然后讨论它是如何工作的。 //forloop.cpp #if 1 #include<iostream> using namespace std;int main() {int i;for (i 0; …

百云齐鲁 | 云轴科技ZStack成功实践精选(山东)

山东省作为我国重要的工业基地和北方地区经济发展的战略支点&#xff0c;在“十四五”规划中将数字强省建设分为数字基础设施、数字科技、数字经济、数字政府、数字社会、数字生态六大部分&#xff0c;涵盖政治、经济、民生等多个方面&#xff0c;并将大数据、云计算、人工智能…

数电实验-----实现74LS153芯片扩展为8选1数据选择器以及应用(Quartus II )

目录 一、74LS153芯片介绍 管脚图 功能表 二、4选1选择器扩展为8选1选择器 1.扩展原理 2.电路图连接&#xff08;Quartus II &#xff09; 3.仿真结果 三、8选1选择器的应用 1.三变量表决器 2.奇偶校验电路 一、74LS153芯片介绍 74ls153芯片是属于四选一选择器的芯片。…

Nginx-负载均衡-动静分离-虚拟主机

负载均衡 负载均衡基本使用 1 配置上游服务器 upstream myserver { #是server外层server ip1:8080;server ip1:8080; }2 配置代理 server {location / { proxy_pass http://myserver;#请求转向myserver 定义的服务器列表 注意这个http不能丢 pro…

VulnHub DC-7

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

文章目录 一、算法原理二、例题2.1 最大子数组和2.2 环形子数组的最大和 一、算法原理 Kadanes算法是一种用于解决最大子数组和问题的动态规划算法。这类问题的目标是在给定整数数组中找到一个连续的子数组&#xff0c;使其元素之和最大&#xff08;数组含有负数&#xff09;。…

MySQL为什么选择了B+树

首先MySQL的数据**&#xff08;索引记录&#xff09;**是存在磁盘里的&#xff0c;磁盘读取非常慢&#xff0c;所以要尽可能减少磁盘操作&#xff0c;因此我们需要更好的利用索引。 首先索引按顺序排列了数据&#xff0c;那么很显然最好的查找方式是二分查找&#xff0c;数组自…

【Spring Boot】使用WebSocket协议完成来单提醒及客户催单功能

1 WebSocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 1.1 HTTP协议和WebSocket协议对比 1、HTTP是短…

【10套模拟】【7】

关键字&#xff1a; 二叉排序树插入一定是叶子、单链表简单选择排序、子串匹配、层次遍历

【Python】问题描述:输入A、B,输出A+B。样例输入12 45样例输出57

1、问题描述 输入A、B&#xff0c;输出AB。 样例输入 12 45 样例输出 57 nums list(map(int,input().split(" "))) print(sum(nums))

Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的创建 2.0 判断回文链表说明 2.1 快慢指针方法 2.2 使用递归方式实现反转链表方法 2.3 实现判断回文链表 - 使用快慢指针与反转链表方法 3.0 判断环链表说明…

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工水母优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

vue-admin-template改变接口地址

修改登录接口 1.f12查看请求接口 模仿返回数据写接口 修改方式1 1.在env.devolopment修改 修改方式2 vue.config.js 改成本地接口地址 配置转发 后端创建相应接口&#xff0c;使用map返回相同的数据 修改前端请求路径 修改前端返回状态码 utils里面的request.js

Iceberg学习笔记(1)—— 基础知识

Iceberg是一个面向海量数据分析场景的开放表格式&#xff08;Table Format&#xff09;&#xff0c;其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式&#xff08;Table Format&#xff09;可以理解为元数据以及数据文件的一种组织方式&#xff0c;处于计算框架&…

Positive Technologies 利用 PT Cloud Application Firewall 保护中小型企业的网络资源

云产品按月订购&#xff0c;无需购买硬件资源 PT Cloud Application Firewall 是 Positive Technologies 推出的首个用于保护网络应用程序的商用云产品。Web 应用层防火墙 (web application firewall, WAF) 现在可以通过 技术合作伙伴——授权服务商和云提供商以订购方式提供1…