C++-带你深度理解string类的常见接口

1. 为什么学习string类?

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。

在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本 都使用string类,很少有人去使用C库中的字符串操作函数。


2. 标准库中的string

2.1 string(了解)

下面这个链接是c++官网里面有关string的文档介绍。

cplusplus.com/reference/string/string/?kw=string

STL(standard template libaray-标准模板库)C++标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架

string比STL出现的还要早,所以不包含在contain的类别里面,但也算是一种数据结构。

1. 字符串是表示字符序列的类
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性。
3. string 类是使用 char( 即作为它的字符类型,使用它的默认 char_traits 和分配器类型 ( 关于模板的更多信息,请参阅basic_string)
4. string 类是 basic_string 模板类的一个实例,它使用 char 来实例化 basic_string 模板类,并用 char_traits和allocator 作为 basic_string 的默认参数 ( 根于更多的模板信息请参考 basic_string)
5. 注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( UTF-8) 的序列,这个类的所有成员( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。
总结:
1. string是表示字符串的字符串类
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string。

4. 不能操作多字节或者变长字符的序列。 

使用 string 类时,必须包含 #include 头文件以及 using namespace std ;

2.2 string类的常用接口说明

2.2.1string的构造

 首先给大家介绍无参的string构造,以及使用字符串构造,还有拷贝构造这三种最常用的构造方式。如果想打印string类的对象直接使用cout即可,因为string类重载了流插入和流提取。

int main()
{//string(),构造空的string类对象s1string s1;//string(const char* s),用C格式字符串构造string类对象s2string s2("hello world");//string(string s),拷贝构造s3string s3(s2);cout<<s3<<endl;return 0;
}

 2.2.2string的析构

string相当于是一个管理字符串的顺序表,也就是字符串数组,内部的数组的是动态开辟的,需要释放,但是这个析构函数是自动调用的。

 

 2.2.3string的赋值重载

string类的赋值重载有三个,用的最多的还是前面两个。

int main()
{string s1("hello c++");string s2 = s1;string s3 = "hello c++";cout << s2 << endl;cout << s3 << endl;return 0;
}

 

2.2.4 string类对象的容量操作

2.2.4.1size和length

string类的size和length接口是完全一样的,只是由于STL的发展历史原因,后面才出现的size。虽说length出现的早,但是实际上size用的更多,都不包含/0。

2.2.4.2operator[]

那么我们怎么遍历一个string类的对象呢?使用[]是比较方便的,也更加容易理解,因为原始数组就是用的[]遍历的,[]就是operator[],运算符重载。 

int main()
{string s1 = "hello world";for (int i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;return 0;
}

[]不仅可以读,也可以写,因为返回值是起始字符的引用。

int main()
{string s1 = "hello world";for (int i = 0; i < s1.size(); i++){cout << s1[i];}cout << endl;s1[0] = 'z';cout << s1 << endl;return 0;
}

[]在字符串的遍历这方面也挺方便的,用起来跟数组的下标一样。

2.2.4.3c++的swap

c++的库里面有一个swap函数,用起来非常的方便,库里面的swap是一个函数模板,所以可以支持各种数据类型。

2.2.4.4迭代器

c++里面还有一个东西可以支持大部分数据类型的的遍历,那就是迭代器(iterator),迭代器不仅可以遍历,还可以修改,迭代器是主流的访问容器的一种方式。下标和[]适用于物理空间上是连续的情况,链式结构,树形结构,哈希表等就只能用迭代器来遍历。

注意:const_iterator是const迭代器,它的目的是使迭代器指向的内容不能被修改,而不是迭代器本身不能被修改。

2.2.4.5rbegin

如果我们想倒着访问string类的对象,可以使用反向迭代器reverse_iterator,rbegin指向最后一个字符,rend就是第一个字符,it++就是向前遍历。 

2.2.4.6reserve

 reserve就是保留的意思,可以给string预留空间,也就是开空间,在我们知道需要多少空间时,可以用reserve提前开好空间,reserve只影响容量,不会影响数据,当然各个编译器的机制不一样。

2.2.4.7capacity

capacity就是容量,代表的是实际能存放多少个字符,而不是实际空间有多大,因为最后还有\0,\0不算是有效字符,是个标识符,实际空间比capacity大一,因为要留个空间存放\0。 

int main()
{string s1 = "hello zxf";string::reverse_iterator it = s1.rbegin();while (it != s1.rend()){cout << *it;it++;}cout << endl;s1.reserve(30);cout << s1 << endl;cout << s1.capacity() << endl;return 0;
}

2.2.4.8resize

 大家再来看一下resize这个接口,resize既影响容量,也会影响数据,resize之后的容量肯定要比resize的数据要大,保证空间足够,size则为resize的大小,resize如果比之前的容量大,则会发生扩容,那么resize之后的数据既然是100了,那么当我们打印出来的时候,为什么什么都看不见呢?因为后面的数据全部都是\0。如果不想让后面是\0,就可以使用resize的一个重载,这个重载的第二个参数是一个字符。意思就是如果显示传了这个字符,那么后面插入的字符就是该字符,如果没有传的话,则是\0这个空字符。

在vs编译器上,如果resize的数据在size和capacity之间的话,那么size会发生变化,capacity不会变。

在vs编译器上,如果resize的数据小于size,那么size会减小,并且数据会删除,capacity不会变。

总结:

1.resize数据>capacity,扩容+尾插

2.size<resize数据<capacity,尾插

3.resize数据<size,尾删 

2.2.4.9push_back

push_back这个函数一次只能尾插一个字符,效率太低了,因此我们可以使用append。 

2.2.4.10append 

append函数有许多个重载,使用的方法也很简单,就不一一介绍了。

 

2.2.4.11operator+=

 虽然append实现了这么多重载,但是有一个接口更加好用,就是运算符+=的重载。+=不仅更加的方便,并且代码的可读性也变强了。 

 2.2.4.12insert

insert这个接口只要第一个和第三个重载用的最多,在某个位置插入字符串或者string类的对象。

 2.2.4.13erase

erase用法也很简单,不做过多说明。

 2.2.4.14assign

assign相当于赋值,也有许多个重载。

 2.2.4.15replace

replace就是替换的意思,虽然看起来很好用,但是成本比较高,不太推荐使用。

 2.2.4.16find

find就是查找某个字符,可以从任意位置开始查找,返回的是这个字符的下标,不给开始查找的位置则默认为0,如果找不到的话返回值是整型的最大值.

2.2.4.17copy

copy就是拷贝string类对象的一部分到一个数组里面去,下面这段代码就是从拷贝下标为4的位置开始拷贝,拷贝长度为6的字符。 

 

 2.2.4.18find_first_of

find_first_of就是在string类的对象里面找到需要找的字符,并且返回下标,注意寻找的可以是多个。

2.2.4.19find_last_of 

find_last_of就是从后往前找,用法和find_first_of是一样的。

2.2.4.20substr 

substr就是从pos位置开始读出长度为len的字符串,返回的是string类。

 


今天的分享到这里就结束了,感谢大家的阅读! 

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

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

相关文章

“从根到叶:深入理解堆数据结构“

​​​​​​​ 一.堆的概念及实现 1.1堆的概念 在数据结构中&#xff0c;堆是一种特殊的树形数据结构。堆可以分为最大堆和最小堆两种类型。 最大堆&#xff1a;对于堆中的任意节点&#xff0c;其父节点的值都不小于它的值。换句话说&#xff0c;最大堆中的根节点是堆中的最…

AI论文速读 | 2024【综述】图神经网络在智能交通系统中的应用

论文标题&#xff1a;A Survey on Graph Neural Networks in Intelligent Transportation Systems 链接&#xff1a;https://arxiv.org/abs/2401.00713 作者&#xff1a;Hourun Li, Yusheng Zhao, Zhengyang Mao, Yifang Qin, Zhiping Xiao, Jiaqi Feng, Yiyang Gu, Wei Ju, …

PR:熟悉PR工作环境

新建项目 设置自己的页面布局 首选项

【Algorithms 4】算法(第4版)学习笔记 07 - 2.4 优先队列

文章目录 前言参考目录学习笔记1&#xff1a;API1.1&#xff1a;实现 demo 示例1.2&#xff1a;初级实现&#xff08;有序或无序的数组&#xff09;2&#xff1a;二叉堆2.1&#xff1a;完全二叉树2.2&#xff1a;二叉堆2.2.1&#xff1a;堆的表示2.2.2&#xff1a;属性2.3&…

Java 基于 SpringBoot+Vue 的智慧外贸平台的研究与实现,附源码

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

【Vue】Vue基础入门

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳重求进&#xff0c;晒太阳 Vue概念 是一个用于构建用户界面的渐进式框架优点&#xff1a;大大提高开发效率缺点&#xff1a;需要理解记忆规则 创建Vue实例 步骤&#xff1a; …

Arm发布新的人工智能Cortex-M处理器

Arm发布了一款新的Cortex-M处理器&#xff0c;旨在为资源受限的物联网&#xff08;IoT&#xff09;设备提供先进的人工智能功能。这款新的Cortex-M52声称是最小的、面积和成本效率最高的处理器&#xff0c;采用了Arm Helium技术&#xff0c;使开发者能够在单一工具链上使用简化…

小结与数字的魅力的开篇

小结 本系列主要介绍了一些排序算法&#xff0c;包括冒泡排序、快速排序、直接插入排序、希尔排序、简单选择排序、堆排序、归并排序、计数排序、桶排序和基数排序。 排序算法本身并不难&#xff0c;但其涉及的知识点却星罗棋布&#xff0c;其变化莫测的思路更让人难以捉摸&am…

移动机器人激光SLAM导航(五):Cartographer SLAM 篇

参考 Cartographer 官方文档Cartographer 从入门到精通 1. Cartographer 安装 1.1 前置条件 推荐在刚装好的 Ubuntu 16.04 或 Ubuntu 18.04 上进行编译ROS 安装&#xff1a;ROS学习1&#xff1a;ROS概述与环境搭建 1.2 依赖库安装 资源下载完解压并执行以下指令 https://pa…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

【Java程序设计】【C00260】基于Springboot的企业客户信息反馈平台(有论文)

基于Springboot的企业客户信息反馈平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的企业客户信息反馈平台 本系统分为平台功能模块、管理员功能模块以及客户功能模块。 平台功能模块&#xff1a;在平台首页可…

FastAI 之书(面向程序员的 FastAI)(六)

原文&#xff1a;www.bookstack.cn/read/th-fastai-book 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十三章&#xff1a;卷积神经网络 原文&#xff1a;www.bookstack.cn/read/th-fastai-book/44d8848dfac0c1b0.md 译者&#xff1a;飞龙 协议&#xff1a;CC BY-N…

【Java程序设计】【C00257】基于Springboot的校园二手书交易平台(有论文)

基于Springboot的校园二手书交易平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的乐校园二手书交易管理系统 本系统分为系统功能模块、管理员功能模块、卖家用户功能模块以及用户功能模块。 系统功能模块&…

【教程】C++语言基础学习笔记(九)——指针

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

消息中间件特点

1.  消息中间件概念 消息中间件是消息传递的过程中保存消息的容器。 主要目的&#xff1a;提供路由并保证消息的传递&#xff1b;如果发送消息时接受者不可用&#xff0c;消息队列会保留信息&#xff0c;直到可以成功传递为止。 消息中间件保存消息也是有期限的。 2.  消息…

车载软件架构 —— Adaptive AUTOSAR软件架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师&#xff08;Wechat&#xff1a;gongkenan2013&#xff09;。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#…

【Zigbee课程设计系列文章】Zigbee开发环境搭建

【Zigbee课程设计系列文章】Zigbee开发环境搭建 前言IAR 下载安装Z-Stack协议栈安装 &#x1f38a;项目专栏&#xff1a;【Zigbee课程设计系列文章】&#xff08;附详细使用教程完整代码原理图完整课设报告&#xff09; 前言 &#x1f451;由于无线传感器网络&#xff08;也即…

每日一练——月落乌啼算钱

题目&#xff1a; 举例&#xff1a; 输入&#xff1a;6&#xff0c;输出&#xff1a;8.00 最开始看到这道题还有点蒙&#xff0c;但是看到他的公式想起了斐波那契数列 1,1,2,3,5,8...... 由前两个数相加得到第三个数&#xff0c;为An2An1An。 可以得出这个题目中所给的通项就…

大更新!gpt加入记忆功能,可以记忆自己的提问啦!

2月14日凌晨&#xff0c;OpenAI在官网宣布&#xff0c;正在测试ChatGPT记住用户提问内容的能力&#xff0c;同时可以自由控制其内存。 该功能使用户不必频繁地提问相同的内容&#xff0c;ChatGPT都将记住那些内容并对长对话、个性化聊天等&#xff0c;例如&#xff0c;写长文小…

基于Python的HTTP隧道安全性分析:魔法背后的锁与钥匙

当我们谈论基于Python的HTTP隧道时&#xff0c;不禁让人想起那些神秘的魔法门。但是&#xff0c;在魔法背后&#xff0c;我们也需要确保安全性&#xff0c;就像需要确保魔法不会落入邪恶之手一样。那么&#xff0c;基于Python的HTTP隧道在安全性方面表现如何呢&#xff1f;让我…