C++——string的使用

string的使用

  • 1. STL
  • 2. string
    • 2.1 初始化和遍历
    • 2.2 容量相关
    • 2.3 串的修改
    • 2.4 其他接口

1. STL

STL全称 standard template libaray——标准模板库,内部包含了很多数据结构和算法,数据结构包括栈,队列,树,链表等,算法包括交换,排序,查找,逆置等。是一个C++标准库的重要组成部分。STL不止含有这两部分,接下来就慢慢进入STL的学习,先从使用开始。

这里有一个网址,大家可以在这个网址上学习

https://legacy.cplusplus.com/

2. string

string就是字符串,它其实是类模板实例化出来的一个类,存储的是字符
在这里插入图片描述

2.1 初始化和遍历

初始化是通过构造函数进行的,先来看看有哪些吧
在这里插入图片描述
第一个默认构造;第二个拷贝构造,通过一个已存在的对象初始化;第三个通过存在对象的部分内容初始化;第四,五个都是通过字符串来初始化;第六个是通过n个字符初始化;最后一个是通过迭代器区间初始化。用的比较多的是第2,3,4,5个。

在string和vector(顺序表)中迭代器的使用和指针基本类似。后续会介绍迭代器具体是什么。

遍历方式1:下标 + [ ]
string类重载了operator[ ],可以通过类似数组那样的方式遍历string对象。
在这里插入图片描述
遍历方式2:范围for循环遍历
遍历方式3:迭代器遍历

迭代器类似指针
在这里插入图片描述
begin可以获得string第一个字符的地址,end可以获得string最后一个字符的下一个位置的地址。
rbegin可以获得string反向的第一个字符的地址,即最后一个字符的地址;rend可以获得string的反向的最后一个字符的下一个位置的地址。如下图

在这里插入图片描述
最后四个是对const对象新增的函数,但是前四个已经重载了const版本的,所以后四个不需要使用。
并且每一种容器都有迭代器,因此使用时,需要指定类域。返回值类型大家可以点进去自行查看。

对于这三种遍历,给出如下实例代码。

#include<iostream>
#include<string>
using namespace std;
void test2()
{
	//使用字符串来初始化,for循环+下标+ [ ]遍历
	string s1("ABCDEFG");

	//for循环
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i];
	}
	cout << endl;

	//拷贝构造初始化,范围for遍历
	string s2(s1);
	for (auto ch : s2)
	{
		cout << ch;
	}
	cout << endl;

	//n个字符初始化,迭代器遍历
	string s3(10, 'B');
	string::iterator i = s3.begin();
	while (i != s3.end())
	{
		cout << *i;
		i++;
	}
	cout << endl;

    //反向遍历
	const string s4 = s1;
	string::const_reverse_iterator ci = s4.rbegin();
	while (ci != s4.rend())
	{
		cout << *ci;
		ci++;
	}
	cout << endl;
}

int main()
{
	test2();
	return 0;
}

运行结果如下图
在这里插入图片描述

总结:推荐使用下标 + [ ] ,可以正向遍历,也可以逆向遍历;范围for不支持逆向遍历。迭代器可读性较差。对于后续的无法使用下标 + [ ] 遍历的,就要使用迭代器遍历了。

2.2 容量相关

在这里插入图片描述
sizelength都是获得字符串的大小;

string s(“ABCDEFG”);
cout<<s.size()<<endl;

max_size是获得可初始化的最长字符串的长度(没有什么作用);

resize是更新string对象size的大小。
capacity是获得string对象capacity的大小,vs上默认是16

#include<iostream>
#include<string>
using namespace std;
void test3()
{
	string s("ABCDEFG");
	cout <<"更新前size = "<< s.size() << endl;
	cout <<"更新前capacity = "<< s.capacity() << endl;
	s.resize(20);
	cout << "更新后size = " << s.size() << endl;
	cout << "更新后capacity = " << s.capacity() << endl;
	
}

int main()
{
	test3();
	return 0;
}

运行结果如下
在这里插入图片描述
当更新的size超过15时,会更改capacity的大小,原因是空间不够需要扩容。
下面这段代码可以观察vs是如何扩容的。

void test_capacity()
{
	string s;
	//保留原大小
	size_t capacity = s.capacity();
	cout << "capacity:" << s.capacity() << endl;
	//循环插入字符A,空间不够会扩容
	for (int i = 0; i < 200; i++)
	{
		s += 'A';
		//扩容时打印
		if (capacity != s.capacity())
		{
			cout <<  s.capacity() << endl;
			capacity = s.capacity();
		}
	}
}

运行结果如下
在这里插入图片描述
起始值是15,第一次扩容为2倍,后续都是1.5倍。扩容的消耗很大,因此如果事先能知道需要多少空间,可以一次开完全就不会造成这样的消耗了。

reserve可以扩充容量,用法如下

string s;
s.reserve(扩容后的大小)

还是上面的代码,如果实现就给好200个空间。那么就不需要扩容了。
在这里插入图片描述
运行结果可以看出,没有扩容,但是容量不是200,它可能多给空间,但不会少给。
但是给的数值如果小于原来的空间,这个函数就不做处理。

总结:resize会改变size,可能改变capacity;reserve会改变capacity,不会改变size

clear可以将字符串内容清空,使之变成空串,改变size(变为0),不改变capacity
empty判断是否是空串。
shrink_to_fit可以缩小串的容量(不建议使用,因此不做详谈)

2.3 串的修改

在这里插入图片描述
**operator+=**是重载的运算符,可以尾插一个字符串或字符或string对象
在这里插入图片描述
push_back尾插一个字符
append用法较多,但不如operator+=方便,可读性也不如operator+=,因此不做过多介绍。
insert用法也比较多,这里介绍和演示几个较为常用的。
在这里插入图片描述
第一个:在pos位置插入一个string对象;第三个:在pos位置插入一个字符串;第四个:在pos位置插入字符串的n个字符;第五个:在pos位置插入n个字符

在这里插入图片描述
assign是给该字符串一个新的值,替换当前的内容,用法和初始化很类似。
erase为删除字符
在这里插入图片描述
第一个:删除pos位置的len个字符,不给实参或者len超过字符串的长度时,将全部删除。npos为整型的最大值。
第二个:删除一个迭代器位置的字符
第三个:删除一段迭代器区间

在这里插入图片描述

swap为交换两个string对象
pop_back为删除最后一个字符

2.4 其他接口

在这里插入图片描述
c_str和data可以获得c类型的字符串。如下图
在这里插入图片描述

这两个函数获得的是**_str**,因为有些C语言的接口操作的是字符串,不是string对象。

find和rfind分别是正向和反向找第一个符合条件的字符或字串。找到返回下标,找不到返回npos
比如我们要打印这句英文的第一个和最后一个单词Life is full of possibilities可以这样写。

void test_string2()
{
	string s = "Life is full of possibilities";
	size_t pos = s.find(' ');  //拿到第一个空格的下标,即4

	string sbegin = s.substr(0,pos);//拿到字串,从下标为0到下标为pos位置之前,左闭右开 [0 ,pos)
	cout << sbegin << endl;
	size_t pos1 = s.rfind(" ");//拿到最后一个空格的下标
	string send = s.substr(pos1 + 1);//拿到字串,从pos1+1开始,没有右区间,就会取完全部字符
	cout << send << endl;
}

运行结果如下
在这里插入图片描述
substr为获取字串,上面已经有介绍用法了,这里看下函数原型,就不多解释了。
在这里插入图片描述
compar为比较两个串的大小,原理和strcmp一样。
在这里插入图片描述
其他函数用的很少,大家可以自己对照文档了解。关于string常用函数接口的解释就到这里了。

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

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

相关文章

【高阶数据结构】图 -- 详解

一、图的基本概念 图 是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)。其中&#xff1a; 顶点集合 V {x | x属于某个数据对象集} 是有穷非空集合&#xff1b; E {(x,y) | x,y属于V} 或者 E {<x, y> | x,y属于V && Path(x, y…

【SpringBoot整合系列】SpringBoot整合RabbitMQ-基本使用

目录 SpringtBoot整合RabbitMQ1.依赖2.配置RabbitMQ的7种模式1.简单模式&#xff08;Hello World&#xff09;应用场景代码示例 2.工作队列模式&#xff08;Work queues&#xff09;应用场景代码示例手动 ack代码示例 3.订阅模式&#xff08;Publish/Subscribe&#xff09;应用…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

本安防爆手机在电力行业中的应用

在电力行业这一充满挑战与风险的领域中&#xff0c;安全始终是最为首要的考量。电力巡检、维修等作业往往涉及易燃、易爆环境&#xff0c;这就要求工作人员配备能够在极端条件下保障通讯和作业安全的专业设备。防爆手机应运而生&#xff0c;以其独特的设计和卓越的性能&#xf…

05、Kafka 操作命令

05、Kafka 操作命令 1、主题命令 &#xff08;1&#xff09;创建主题 kafka-topics.sh --create --bootstrap-server 192.168.135.132:9092,192.168.135.133:9092,192.168.135.134:9092 --topic test1 --partitions 4 --replication-factor 3–bootstrap-server&#xff1a;…

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用

一、Istio 流量管理 Istio是一个开源的服务网格&#xff0c;它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全&#xff0c;并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理&#xff08;Envoy&#x…

防静电段码屏驱动VK2C23适用于水电气表以及工控仪表类产品

VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09;或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff0c;也可通过指令进入省电模式。其高抗干扰&#xff…

Django实验(远程访问+图片显示)

众所周知&#xff0c;Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是&#xff1a;做一个快速的AI Demo。 第一步&#xff1a;安装一个版本5.0以上django 第二步&#xff1a;构建咱们的Django工程&#xff0c;我取名为BBQ django-adm…

static静态成员变量和静态方法

当有new创建一个对象的,里面属性和方法,通过构造函数,能定义多个不同的对象,在我们做面向对象开发的时候,给一个场景,人在一个班级的时候,你的老师可能是固定的。 当我们用构造方法去构造的时候&#xff0c;每次都去传递一个固定的实参去定义个老师。 这样好会显得代码非常的…

Linux网络编程:TCP并发服务器实现

目录 1、前言 2、多进程代码实现 2.1 创建新的进程 2.2 客户端接收响应函数 2.3 僵尸进程处理 2.4 完整代码 2.5 代码测试 3、多线程代码实现 3.1 创建新的线程 3.2 线程函数定义 3.3 完整代码 3.4 代码测试 4、总结 1、前言 前面实现了基本的TCP编程&#xf…

理解机器学习中的类别不平衡问题

大家好&#xff0c;实际世界的数据集通常是杂乱的,当不同类别之间的样本分布不均匀时&#xff0c;就会出现类别不平衡。或者说&#xff0c;某些类别的样本比其他类别多得多。例如&#xff0c;考虑一个信用卡违约数据集&#xff0c;信用卡违约是一个相对较少发生的事件&#xff…

Java入门基础学习笔记2——JDK的选择下载安装

搭建Java的开发环境&#xff1a; Java的产品叫JDK&#xff08;Java Development Kit&#xff1a; Java开发者工具包&#xff09;&#xff0c;必须安装JDK才能使用Java。 JDK的发展史&#xff1a; LTS&#xff1a;Long-term Support&#xff1a;长期支持版。指的Java会对这些版…

Sass语法介绍-变量介绍

02 【Sass语法介绍-变量】 sass有两种语法格式Sass(早期的缩进格式&#xff1a;Indented Sass)和SCSS(Sassy CSS) 目前最常用的是SCSS&#xff0c;任何css文件将后缀改为scss&#xff0c;都可以直接使用Sassy CSS语法编写。 所有有效的 CSS 也同样都是有效的 SCSS。 Sass语…

javaMail快速部署——发邮件喽~

目录 功能阐述 前序步骤 &#xff08;1&#xff09;到QQ邮箱中获取到授权码 代码实现 坑 今天在写一个修改密码的功能的时候要用到邮箱的发送&#xff0c;然后因为这个项目比较老旧了&#xff0c;采用的是javaWeb和jsp的配置&#xff0c;对于我只使用过springBoot整合的ja…

京东手势验证码-YOLO姿态识别+Bézier curve轨迹拟合

这次给老铁们带来的是京东手势验证码的识别。 目标网站&#xff1a;https://plogin.m.jd.com/mreg/index 验证码如下图: 当第一眼看到这个验证码的时候&#xff0c;就头大了&#xff0c;这玩意咋识别&#xff1f;&#xff1f;&#xff1f; 静下心来细想后的一个方案&#xf…

JavaWeb中的Session和Cookie

前言 什么是会话跟踪技术 Cookie 1.什么是cookie 2.Cookie的应用 2.1 保持用户登录状态 2.2 记录用户名 3. Cookie的设置和获取 3.1 、通过HttpServletResponse.addCookie的方式设置Cookie 3.2、浏览器中查看cookie的内容 3.3、服务端获取客户端携带的cookie&#xf…

240+ Stylized Arctic Textures - Snow, Ice More

240+风格化的雪、冰、雪岩和其他雪纹理的集合,用于北极风格化/幻想/rpg风格的游戏环境。 在这个系列中,你会在风格化/幻想/rpg风格的游戏中找到大量适合北极和其他雪地环境的纹理——雪、冰、雪地岩石、雪地草、雪地砾石、雪地等等! 每个纹理都是可平铺/无缝的,并与各种不同…

C++语法|进程虚拟地址空间和函数调用栈

本文来自施磊老师的课程&#xff0c;老师讲的非常不错&#xff0c;我的笔记也是囫囵吞枣全部记下&#xff0c;但是我在这里推荐一本书&#xff0c;真的真的建议初学C或者想要进阶C的同学们看看&#xff1a;《CPU眼里的C/C》 文章目录 进程的虚拟地址空间和布局进程虚拟地址空间…

布隆过滤器和黑名单,解决Redis缓存穿透

目录 1.什么是布隆过滤器&#xff1f; 2.布隆过滤器的原理 3.空间计算 4.布隆过滤器的视线场景&#xff1a; 5.在Spring Boot中集成Redisson实现布隆过滤器 6、Redisson实现布隆过滤器 6.1导入依赖 6.2使用 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布…

邮件大附件系统如何进行安全、高效的大附件发送?

邮件大附件系统是一套解决传统电子邮件系统&#xff0c;在发送大文件时遇到限制的解决方案。由于传统电子邮件系统通常对附件大小有限制&#xff0c;这使得发送大文件变得困难。邮件大附件系统通过各种技术手段&#xff0c;允许用户发送超过传统限制的大文件&#xff0c;通常在…