String(二)————迭代器及相关接口使用

news2024/9/20 14:45:05

目录

string构造接口(Construct string object)

string的元素访问(读写)

 迭代器


string构造接口(Construct string object)

string相比于C语言的字符数组要好用的多,无论是在初始化还是在读写方面都方便许多。

以basic_string<char> 为例,来看一下它的构造接口:

1、 第一个string():无参类型的构造,字符串长度为0。

2、string (const string& str) :拷贝构造

3、string (const string& str, size_t pos, size_t len = npos)

以一个字符串的第pos个字符后一位开始,长度为len构造一个字符串:

 如果构造字符串的过程超过了目标字符串最后一位,那么将拷贝到最后一位停止:

4、string (const char* s) :以字符串为参数构造,有两种形式。

5、string (const char* s, size_t n)  :从一个字符串的第n+1位开始进行构造:

6、string (size_t n, char c) :构造n个c字符的字符串:

7、string (InputIterator first, InputIterator last) :从first开始到 last结束进行构造字符串:

此外对多个字符串还能进行拼接,使用重载运算符 += 即可:

上面所讲,红色标注的为重点,其他的了解用法即可。

string的元素访问(读写)

 string中也对运算符 [  ]进行了重载,使得可以通过下标来访问元素。

[ ] 运算符重载原型如下:

    char& operator[](size_t i)
    {
        assert(i < s0.size() );
        return _str[i];
    } 

 并且相比于静态数组,它可以防止溢出。

 这里也可以使用范围for:

 看起来范围for好像是比用下标访问要简单一点,但是有的情况下用下标访问比较好,比如需要逆置上面的数组时:

 迭代器

上面的数组还有第三种表示方式,就是迭代器。

迭代器是string类里定义的类型,但不是内部类,只是在其中定义,属于string类。

迭代器 iterators是一种行为像指针的类型,但它底层是不是指针不确定,具体要看实现,但是它的用法很像指针,且看他如何访问数组元素:

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

it 是迭代器的对象,迭代器里面都有begin和end,分别表示第一个元素和最后一个的下一个元素。

这是正向迭代器,还有反向迭代器

	string::reverse_iterator rit = s0.rbegin();
	while (rit != s0.rend())
	{
		*rit += 1;
		++rit;
	}
	rit = s0.rbegin();
	while (rit != s0.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

 与正向相对,反向开始是rbegin,结束是rend,它是倒着遍历的。

看到迭代器的示例,有人会问 “这迭代器看上去非常麻烦,不好理解而且难记,不如直接用下标访问的方式 ”

————下标访问的方式在string和vector(顺序表)中可以使用,但是在其他容器(如map)就无法使用了。而迭代器是一种容器通用的遍历方式,具有普遍性。

迭代器还有const修饰类型的,上面讲的迭代器对数据可读可写,const修饰的是只读属性,像print这种接口就要写成const修饰的。

void print(const string& s)
{
	string::const_iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
int main()
{
	string s0("abcd");
	print(s0);
	return 0;
}

string::const_iterator it = s.begin(); 这里要用const修饰迭代器对象,防止修改迭代器里的内容(*it)注意:这里不能写成 const string::iterator it = s.begin(); 这种是防止修改 it本身,而我们要遍历是需要修改 it 的,而 it 指向的内容不能修改。

const修饰的迭代器有正向的,也就有反向的。

void Test1()
{
	string s0 = "qwer";
	string::const_reverse_iterator rit = s0.rbegin();
	while (rit != s0.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
}

看上去确实长了点,但是有的时候是不可避免的,只要意思表达清楚即可,何况库里面也是这么使用的。

总结:正向、反向迭代器可以读取和修改容器数据,而const正向、反向迭代器可以读取和修改容器数据。

那么什么时候需要const版本,什么时候需要非const版本呢?

1、当数据是只读的,只需要const版本;

2、当数据是只写的,只需要非const版本;

3、当数据是可读可写的,两个都需要。

 

 

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

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

相关文章

排序5:直接选择排序

目录 排序思想&#xff1a; 演示图&#xff1a; 代码实现 总结&#xff1a; 排序思想&#xff1a; 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素&#xff0c;则将它与这组元素中的最后一个&#xff08;第一个…

SpringMVC---->自我实现底层机制(吃透springMVC)

目录 配套代码在资源中&#xff08;免费&#xff09; maven环境搭配 注解注入的规范&#xff1a; 一.开发HongDisptcherServlet前端控制器 1.说明&#xff1a; 2.配置web.xml文件 3.检查前期工作是否成功 二.完成客户端/浏览器请求控制层 1.创建 自己的 Controller 和…

【HTML+CSS+JS】模仿QQ登录界面

目录前言简介布局思路相关代码颜色渐变动画头像表单区域JS相关总结前言 学了HTML、CSS和JS有了一个月了&#xff0c;JS还未学完&#xff0c;偷懒写一个小项目&#xff0c;用了一个下午&#xff0c;顺便巩固一下所学知识。&#xff08;内容比较简陋&#xff0c;适合新手&#x…

基于火鹰优化算法的函数寻优算法

文章目录一、理论基础1、火鹰优化算法2、FHO算法伪代码二、仿真实验与结果分析三、参考文献一、理论基础 1、火鹰优化算法 文献[1]提出了火鹰优化算法(Fire Hawk Optimizer, FHO)作为一种新的元启发式算法&#xff0c;该算法基于啸鸢、麻鹰和褐隼的觅食行为&#xff0c;这些鸟…

【网络原理】网络编程Socket套接字基础知识汇总

目录 1.网络初始&#xff1a; 2.网络编程&#xff1a; 3.UDP数据报套接字&#xff1a; 4.TCP流套接字&#xff1a; 1.网络初始&#xff1a; 局域网&#xff08;LAN&#xff09;广域网&#xff08;WAN&#xff09;IP地址用于定位主机的网络地址。端口号可以标识主机中发送数…

数据结构六:堆

前言&#xff1a;上一篇我们讲了二叉树&#xff0c;你知道吗&#xff1f;堆的底层是一棵完全二叉树。这样说会不会就会觉得熟悉了。 目录 1.堆的概念及存储方式 2&#xff1a;堆的创建 2.1:向下调整 3.堆的插入和删除 3.1&#xff1a;堆的插入 3.2&#xff1a;堆的删除 …

基于Web的商城后台管理系统的设计与实现

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Oracle和MySQL查询所有的表信息和字段信息

Oracle和MySQL查询所有的表信息和字段信息1. MySQL1.1 查询表1.2 查询字段1.2.1 方式1->SHOW FULL COLUMNS1.2.2 方式2->information_schema.COLUMNS1.3 查表和字段1.4 查表和字段-->转程Oracle需要的数据类型2. Oracle2.1 查表和字段的单表查询2.2 整理查表和字段的s…

超详细的JUnit单元测试介绍

前言 本文为JUnit单元测试相关知识&#xff0c;下边将对JUnit单元测试概念&#xff0c;JUnit优点&#xff0c;JUnit安装与使用&#xff0c;JUnit运行流程与常用注解&#xff0c;JUnit测试套件使用及参数化设置&#xff0c;JUnit断言等进行详尽介绍~ &#x1f4cc;博主主页&…

大数据Hadoop之——Apache Hudi 与 Presto/Trino集成

文章目录一、概述二、Trino 环境部署1&#xff09;安装JDK2&#xff09;安装python3&#xff09;安装Trino1、下载解压并配置环境变量2、修改配置3、启动服务4、测试验证三、在Hive中创建表关联Hudi表1&#xff09;添加jar包2&#xff09;创建库表关联Hudi四、Hudi 与 Trino集成…

SpringCloud Alibaba系列 Sentinel(三)

高并发下的微服务容错方案&#xff1f; 限流、熔断、降级 1&#xff1a;限流 在高并发系统中一定要用&#xff0c;高并发的所有请求进来&#xff0c;不是让每个请求都打到后台集群的&#xff0c;后台集群有它的消费能力&#xff0c;应该在它消费能力之内放行请求&#xff0c;…

Hadoop HA集群全是standBy解决办法

文章目录原理解决方案原理 hadoop集群配置HA后&#xff0c;会存在多个namenode&#xff0c;但是同一时间仅有一台NN为Active的状态&#xff0c;其他NN都是StandBy的状态。 上图是hadoop集群配置HA的原理图&#xff0c;从上图我们可以看到多个NN的状态切换&#xff0c;是依靠Z…

linux命令与makefile学习

linux命令与makefile学习文件权限通配符*常用命令makefilegcc与g区别&#xff1a;Linux上有一句话&#xff1a;一切皆文件 普通文件 “-” 目录文件 “d” &#xff08;directory&#xff09; 管道文件 “p” &#xff08;piping&#xff09; 链接文件“l” &#xff08;li…

SAP FICO银行账户余额查询表开发说明书(包括开发源代码、测试样例及FS)

程序说明 满足财务银行账户余额查询明细的需求; 支持财务实时查看银行余额数据。 筛选界面 序号 栏位标题 字段类型 是否必须 是否为范围

【pwn】2022 祥云杯 部分wp

【pwn】2022 祥云杯 部分wp 前言 又是一年的祥云杯&#xff0c;相比去年我啥也不会写&#xff0c;今年起码写了几个签到… 又被队友带飞咯 protool Google的Protobuf&#xff0c;参考学习连接 https://bbs.pediy.com/thread-270004.htm 发现了栈溢出&#xff0c;protobuf…

Unity技术手册-UGUI零基础详细教程-Toggle切换

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 本文约3千字&#xff0c;新手阅读需要7分钟&#xff0c;复习需要2分钟 【收藏随时查阅不再迷路】 &#x1f449;关于作者 众所周知&#…

2.6 Python 基本数据类型

1. 数据类型 类型是变量所指的内存中对象的类型. 内置的type()函数可以用来查询变量所指的对象类型。Python 3中有六个标准的数据类型: Numbers(数字), String(字符串), List(列表), Tuple(元组), Sets(集合), Dictionary(字典).2. Numbers 数字型 Python 有三种数字类型 in…

SpringMVC基本配置

小常规 springmvc的处理器对应的bean必须按照规范格式开发&#xff0c;为避免加入无效的bean可通过bean加载过滤器进行包含设定或排除设定&#xff0c;表现层bean标注通常设定为Controller在此发现图片没有加载出来回到程序去分析当发起一个请求以后DispatcherServlet配置拦截所…

【JVM技术专题】 深入分析class字节码指令方法调用详解「原理篇」

方法调用详解 ​ 调用目标在程序代码写好、编译器进行编译时就必须确定下来&#xff0c;这类方法的调用称为解析。 解析 ​ 在Java语言中符合**“编译期可知&#xff0c;运行期不可变”**这个要求的方法&#xff0c;主要包括静态方法和私有方法两大类&#xff0c;前者与类型…

【JavaScript】网页轮播图

目录HTML搭建功能实现小圆圈事件左右按钮事件自动播放轮播图也叫焦点图&#xff0c;是网页中比较常见的网页特效。功能&#xff1a;鼠标经过轮播图模块&#xff0c;左右按钮显示&#xff0c;离开隐藏左右按钮。点击右侧按钮一次&#xff0c;图片往左播放一张&#xff0c;以此类…