【C++】string简单实用详解

news2025/1/22 8:23:18

本片要分享的内容是有关于string的知识,在这之前得介绍一下什么是STL;

目录

1.STL简单介绍

2. string简单介绍

3.string简单使用

3.1.string的定义

3.2.字符串的拼接

3.3.string的遍历

3.3.1.循环遍历

3.3.2.迭代器遍历

4.string的函数构造


1.STL简单介绍

STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。也就是说他是C++标准库的一个子集,也就是说从今往后我们需要用到数据结构的内容时,不需要再像C语言自己定义结构,使用起来会更加便捷。

当然C++标准库中还有其他的组成部分,其中STL是最常使用的部分,所以我们需要学习它的使用。

首先了解SLT的六大组件

 六大组件中最重要的就是算法容器了,容器其实就可以理解为数据结构,包阔我们之前学的栈、队列、树等等都叫做容器,只是将数据结构换了叫法;

算法就是我们之前所学的像排序、逆置、交换等等都可以称之为算法,目前我们需要重点学习的就是容器算法和迭代器;

2. string简单介绍

严格来说string并不属于STL中,所以在STL中是找不到string的,而string属于标准库,所以当我们在容器中是找不到string的

但是我们可以在标准库中找到string 

 原因是因为string诞生的比STL早一些,但是string的用法和我们今后所学的容器非常相似,我们只要学习完string之后再学习STL容器会容易许多。

接下来观察string的描述

文档中说string是一个用字符的顺序数组实现的一个对象,也可以理解为他管理着字符的数据表;

在日常使用中很多的内容都需要用字符串来表示,比如身份证号,如果使用int表示会超出长度,而且有的人身份证号尾号是x 。

再继续观察string包括的内容

 可以看到string还包括了成员函数自己的成员函数(Member functions),还有迭代器(Iterators),还有容量(capacity)相关的内容。关于 容量方面可以说在之前学习数据结构时有所耳闻,在C语言的学习中我们常常使用数组,顺序表等结构,容量不够时需要我们自己写函数扩容;

但是在C++中我们使用的容量的内容有自扩容属性,也就是空间不够时可以自己开空间,非常好用。

接下来用代码来品一品string的用法

3.string简单使用

3.1.string的定义

如上代码我们就定义好两个字符串了,但是s1没有初始化,s2的初始化方式是拷贝构造,同时还有许多种初始化方式如下

 可以看到我们使用的是第一种定义方式无参构造,和第四种带参构造;

同样的string也支持输入和输出

 

 相比于C语言解决了输入字符导致的越界或者按需申请释放空间的问题,只要我们的内存够大,任何长度的字符串都可以输入输出。

3.2.字符串的拼接

在C++中字符串的拼接非常容易

void test_string2()
{
	string s1("wddniubi ");
	string s2("hello world");
	string ret = s1 + s2;
	cout << ret << endl;
}
int main()
{
	test_string2();

	return 0;
}


我们只需要将s1+s2即可实现字符串的拼接,键盘输入亦可

void test_string3()
{
	string s1;
	string s2;
	cin >> s1;
	cin >> s2;

	cout << s1 + s2 << endl;
}

int main()
{
	test_string3();

	return 0;
}

玩儿法花式多样,比起C语言中的strcat简直不要爽太多哼哼啊啊啊啊啊啊啊啊啊啊;

strcat空间不够不能自行的扩容,并且需要找到'\0'再实现追加,而string完全不需要先找末尾,节省时间

3.3.string的遍历

3.3.1.循环遍历

void test_string4()
{
	string s1("hello world");

	//string遍历
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] ;
	}
	cout << endl;
	
}

在上面的代码中size是capacity 的一个内部函数,是来计算字符串的大小的,相当于strlen,

可以看到遍历输出的结果;

同时我们可以通过遍历对其进行修改

void test_string4()
{
	string s1("hello world");

	//string遍历
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] ;
	}
	cout << endl;
	string遍历修改      
	for (size_t i = 0; i < s1.size(); i++)
	{
		s1[i]++;
	}
	cout << s1;
}

 以上是我们最容易掌握的遍历方式,还有一种方式叫做迭代器

3.3.2.迭代器遍历

直接上代码简单观察

void test_string5()
{
	string s1("hello world");
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it ;
		it++;
	}
	cout << endl;
}

 这里要使用iterator(迭代器)来定义变量it;

 首先我们将迭代器简单理解为一个指针

 这里有三个成员变量,其中_str指向存放着这个字符串的空间;

我们在观察一下迭代器中的函数

 像begin以及下面这些都是迭代器中的成员函数,其中begain指的就是字符串开始的位置。

 那end指向的就是\0的位置;

所以我们只需要while循环中规定结束的条件,字符数组就会从字符串s1的begin的位置一直遍历到end的位置

可以看到已经通过迭代器遍历输出。

同样迭代器除了读取数据,也可以做到写入数据

void test_string5()
{
	string s1("hello world");
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it ;
		it++;
	}
	cout << endl;

	it = s1.begin();
	while (it != s1.end())
	{
		*it='a';
		++it;
	}
	cout << endl;
	cout << s1 << endl;
}

我们将s1的内容都改成了a,结果如下

 那迭代器中还有反向迭代器的用法,比如其中的函数rbegin,用法和begin的用法一样

void test_string6()
{
	string s1("hello world");
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit ;
		++rit;
	}
	cout << endl;
}

 可以看到我们的hello world反过来了

 那反向迭代器就是这样的。

 还可以使用auto来完成反向迭代器

void test_string6()
{
	string s1("hello world");
	auto rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit ;
		++rit;
	}
	cout << endl;
}

 auto会自动推导出rbegin的返回类型,rbegin的返回类型就是reverse_iterator

4.string的函数构造

说完string中一些常用的函数,我们不妨深入观察它的函数构造,先上代码观察

void test_string7()
{
	string s1("hello world");
	cout << s1 << endl;

	string s2(s1, 6, 5);
	cout << s2 << endl;

	string s3("helloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo");
	string s4(s3, 3);
	cout << s4 << endl;
}

 

 可以看到string支持很多拷贝构造的方式,其中第三中有三个参数,那官方的解析如下

 可以看到第三种构造的意思就是说将字符串从第pos个位置开始拷贝len个字符,或者当没有len时会直到字符的结束,可以观察上面的测试代码,我们使用s3拷贝构造s4时,没有给出len的值,那运行结果如下

 可以看到我们直接取到了字符串s4的结尾;

同样的我们也可以使用迭代器区间初始化;

void test_string7()
{

	string s5(5, 'a');
	
	string s6(s5.begin(), s5.end());
	cout << s6 << endl;
}

这里的意思是将s5的前五个数据初始化成为a,随后再用s5的开始和结尾的数据初始化s6,结果如下

 可以看到初始化成功了。

所以string有很多初始化版本,string 的初始化就介绍到这里。

那学习string的目的是为了以后学习STL中容器更方便一些,STL中许多内容都是和string中使用方法相似的,这就是我们学习string的目的

以上就是本片索要分享的内容,如果对你有所帮助还请三连支持,感谢您的阅读。

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

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

相关文章

Android Studio HTTP Proxy怎么设置

好人全部都死光了 —— 宫崎骏 《红猪》 、 《红猪》是一部由宫崎骏执导&#xff0c;森山周一郎 / 冈村明美 / 加藤登纪子主演的一部动画 / 冒险 / 奇幻 / 爱情类型的电影&#xff0c;文章吧小编精心整理的一些观众的观后感&#xff0c;希望对大家能有帮助。 《红猪》观后感(…

MyBatis分页查询与特殊字符处理

目录 目录 一、引言 1.1 简介Mybatis 1.2分页查询的重要性 1.3MyBatis特殊字符处理的挑战 挑战1&#xff1a;SQL注入漏洞 挑战2&#xff1a;查询结果异常 挑战3&#xff1a;数据完整性问题 挑战4&#xff1a;跨平台兼容性 挑战5&#xff1a;用户体验 如何应对挑战 二…

港交所行情协议介绍

目录 一、OMD行情协议 1.时间 2.特色 1&#xff09;频道划分 2&#xff09;双线传输 3&#xff09;重传服务 4&#xff09;刷新服务&#xff08;定时快照&#xff09; 4.规则 1&#xff09;包序号确定 2&#xff09;判断是否重传 5.优缺点 1&#xff09;优点 2&a…

【Java中的IO流】

IO字符输出流&#xff08;FileReader&#xff09; 以内存为基准&#xff0c;可以把文件中的数据以字符的形式读到内存中&#xff1b; public class FileReaderTest1 {public static void main(String[] args) {try (// 1、创建一个文件字符输入流管道与源文件接通Reader fr n…

Linux学习之NFS服务

《Linux 环境下 NFS 服务安装及配置使用》是一篇参考博客。 /etc/exports是NFS服务的配置文件&#xff0c;文件中的内容格式为&#xff1a; 共享目录的路径 允许访问的NFS客户端(共享权限参数1,共享权限参数2,共享权限参数3...)共享权限参数罗列如下&#xff1a; 参数作用ro只…

从非计算机科班到计算机领域:我的转码奇幻之旅

嘿&#xff0c;各位小伙伴们&#xff01;近年来&#xff0c;我发现有越来越多的小伙伴们都在考虑从其他行业跳槽进入计算机领域。你们知道吗&#xff0c;我觉得这真是个酷炫的决定&#xff01;毕竟&#xff0c;在计算机这个领域里&#xff0c;机会和创新无处不在。不过&#xf…

SAP 之如何定义业务范围Business Area

文章目录 前言 一、注意点 二、使用步骤 1.具体定义 2.使用案例 前言 SAP中的业务范围是会计中的一个组织单元&#xff0c;可以根据组织的要求&#xff0c;根据地理或产品来定义。在业务范围下&#xff0c;可以生成资产负债表和损益表的财务报表&#xff0c;用于内部报告。…

基于XL32F003单片机的可控硅调光方案

可控硅调光是一种用于调节电源输出电压的技术&#xff0c;被广泛应用于各种场景。它主要通过改变波形的导通角度来调节输出电压的大小&#xff0c;从而实现对照明设备亮度的控制。在照明市场占据了很大的调光市场。 可控硅调光的兼容性强&#xff0c;应用范围广。例如&#xff…

如何从开源项目中受益?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

如何在 Kubernetes 中借助Ingress 实现灰度发布和蓝绿发布

前言 部署在 Kubernetes 集群中的应用&#xff0c;在升级发布时可能会存在的问题&#xff1a; 1&#xff0c;由于 Kuberneter 底层 Pod 容器生命周期与网络组件生命周期是异步管理的&#xff0c;在升级时如果没有处理好应用优雅退出的问题&#xff0c;就很容易导致 http 访问请…

零信任体系化能力建设(4):应用安全与开发部署

应用和工作负载是企业资产的重要组成部分&#xff0c;也是用户访问企业数据的主要手段和攻击者关注的首要目标&#xff0c;因此&#xff0c;强化对IT栈内软件部分的安全控制是企业推进零信任成熟度的必由之路。 通常&#xff0c;零信任网络访问&#xff08;ZTNA&#xff09;通…

新唐Nuc980学习笔记1 - 工程创建和下载

一、新唐nuc980 新唐nuc980 iot开发板是Linux 工业物联网开发平台&#xff0c;新唐科技提供工业物联网开发平台采用 NUC980DK 微处理器&#xff0c;此为一套完整的工业用物联网开平台&#xff0c;包含了完整的硬件设计与软件参考设计。包含了新唐执行速度 300 MHz 的 ARM9 MPU …

710. 黑名单中的随机数

710. 黑名单中的随机数 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 710. 黑名单中的随机数 https://leetcode.cn/problems/random-pick-with-blacklist/description/ 完成情况&#xff1a; 解题思路&#xff…

Java“牵手”天猫商品评论API接口数据,天猫API接口申请指南

天猫商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝商品详情页面评价内容数据&#xff0c;您可以通过开放平台的接口或者直接访问淘宝商城的网页来获取商品详情信息内的评论数据。以下是两种常用方法…

基于DMA分区计量的实时产销差率估算方法

目前供水企业的产销差率和漏损率一般都以年为单位进行统计&#xff0c;这种计算方法有明显的滞后性&#xff0c;使得供水企业无法第一时间掌握产销差率实际情况。基于此&#xff0c;提出了实时产销差率的 概念&#xff0c;并给出了基于DMA分区计量的实时产销差率估算方法。实际…

Android应用启动流程:从启动到可交互的过程解析

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读1.1 启动知识储备1.2 Zygote进程1.3 SystemServer进程1.4 …

neo4j 图数据库 springboot

一.安装 neo4j社区版在liunx安装部署 https://blog.csdn.net/u013946356/article/details/81736232 二.知识图数据导入 参考:https://notemi.cn/neo4j-import-csv-file-data.html http://openkg.cn/dataset/ch4masterpieces 放在对应的import文件夹下面 导入数据 LOAD C…

SpringCloud/SpringBoot多模块项目中配置公共AOP模块实现打印子模块Controller所有请求参数与日志

项目中遇到多个模块需要打印Controller请求日志&#xff0c;在每个模块里面加AOP并且配置单独的切面笔者认为代码冗余&#xff0c;于是乎就打算把AOP日志打印抽离成一个公共模块&#xff0c;谁想用就引入Maven坐标就行。 定义公共AOP模块 并编写AOP工具 AOP模块pom.xml如下 &…

SpringBoot案例-配置文件-yml配置文件

配置格式 SpringBoot提供了多种属性配置方式 application.propertiesapplication.ymlapplication.yaml常见配置文件格式对比 XML&#xff08;臃肿&#xff09; <configuration><database><host>localhost</host><port>3306</port><use…

VMware虚拟机连不上网络

固定ip地址 进入网络配置文件 cd /etc/sysconfig/network-scripts 打开文件 vi ifcfg-ens33 编辑 BOOTPROTO设置为static&#xff0c;有3个值&#xff08;decp、none、static&#xff09; BOOTPROTO"static" 打开网络 ONBOOT"yes" 固定ip IPADDR1…