string函数以及string常用接口
本文介绍的是C++关键字string中一些重要用法,以及各种字符串序列的处理操作
——飘飘何所似,天地一沙鸥
文章目录
- 前言
- 一、string(字符串类)
- 二、string类对象的容量操作
- 2.1 size/length
- 2.2 capacity
- 2.3 empty/clear
- 2.4 resize/reserve
- 三、string类对象的访问及便利操作
- 3.1 operator[]
- 3.2 begin+end(迭代器)
- 3.3 范围for
- 四、string类对象的修改操作
- 4.1 operator+=/push_back/append
- 4.2 c_str
- 4.3 find/rfind
- 4.4 substr
前言
string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在java、C#中,String类对象创建后,字符串一旦初始化就不能更改,因为string类中所有字符串都是常量,数据是无法更改,由于string对象的不可变,所以可以共享。对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。
一、string(字符串类)
- 字符串是表示字符序列的类。
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 - 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
- string是表示字符串的字符串类。
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名typedefbasic_string<char,char_traits,allocator> string;
- 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;
二、string类对象的容量操作
2.1 size/length
size_t size() const;
计算字符串长度类接口
#include<iostream>using namespace std;int main()
{//创建string类型的字符串strstring str = ("hello C++");//计算str大小std::cout << "The size of str is " << str.size() << " bytes.\n";return 0;
}

length与size并没有什么区别,仅仅只是在STL没有出现时,length就已经存在了,而我们也知道语言的发展一定是向下兼容的它不会去删除原有的东西,只会出现更多的补丁和更加新鲜的东西
#include<iostream>using namespace std;int main()
{string str = ("hello C++");std::cout << "The size of str is " << str.size() << " bytes.\n";std::cout << "The size of str is " << str.length() << " bytes.\n";return 0;
}

2.2 capacity
size_t capacity() const;
计算string类空间大小
#include<iostream>using namespace std;int main()
{string str = ("hello C++");std::cout << "The size of str is " << str.size() << " bytes.\n";std::cout << str.capacity() << endl;return 0;
}

2.3 empty/clear
bool empty() const;
检出字符串释放为空串,是则返回ture,否返回false
void clear();
清空字符串但是不会删除该字符串空间

仅仅只是一个判断string类字符串是否已经置为空。

S1中内容已经被删空但是我们看到S1所在空间并没有被释放还是在原来的地址,并且可以访问到,存入新的东西。
2.4 resize/reserve
void resize (size_t n);
void resize (size_t n, char c);
将有效字符改为n,并将多余的空间用c填充
void reserve (size_t n = 0);
为字符串预留空间

先将s的内容改为和s1一致然后对他们分别使用resize/reserve进行扩容,最后分别输出他们的内容和他们所扩容空间的大小。
resize/reserve根本的区别就在于一个对它所开的空间进行初始化而另一个并不会对开的空间进行初始化,还有一点就是当所开空间小于原有空间时他会保留前面n个数据,然年舍弃多余的部分
另外,在进行空间开辟工作时候,最后事先知道空间用量进行提前预留使用reserve会极大的提高时间复杂度
三、string类对象的访问及便利操作
3.1 operator[]
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
返回pos位置的字符,const string类对象调用
不做过多介绍类似于数组的方式来直接获取第pos个数据

3.2 begin+end(迭代器)
iterator begin();
const_iterator begin() const;
迭代器是string中便利字符串的一种重要工具,具体实现如下

3.3 范围for
范围for的底层实现就是调用迭代器,在使用的时候借用了关键字auto可以不用定义冗余的类型算是一种很方便的用法不过多介绍,代码如下
for(auto ch:s)
{
cout<<ch<<" ";
ch++;
}
cout<<endl;
四、string类对象的修改操作
4.1 operator+=/push_back/append
string& operator+= (const string& str);
string& operator+= (const char s);
string& operator+= (char c)*
最便捷的一种追加方式+=直接在原字符串上进行,可以追加string类/字符串/字符,直接+=
void push_back (char c);
尾插字符c,就是顺序表/链表的那种尾插方式,遍历尾插,不建议用效率很低

operator+=可以随意的进行字符/字符串/类的追加
append!是坑不作介绍不建议用
4.2 c_str
const char c_str() const;*
c_str()是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。 换种说法,c_str ()函数返回一个指向正规C字符串的 指针常量 ,内容与本string串相同。

c_str()返回的是一个临时指针随着原指针指向位置数值的改变
这样看来c_str好像没有实际的意义与用途,其实s_str多用于与其他各种操作一起进行我们只需要了解他的用法就可以,一般不会单独使用来实现什么东西。在进行c_str的使用时尽量在每次都strcpy一下防止丢失。
int main() {char ptr[5];string s = "12345";strcpy(ptr, s.c_str());cout << "s改变前ptr为:" << ptr << endl;s = "66666";cout << "s改变后ptr为:" << ptr << endl;return 0;//结果 ptr=”12345“
}
4.3 find/rfind
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char s, size_t pos = 0) const;
size_t find (const char s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;**
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置

此处我使用的是省略第二个参数,那么它所默认的位置就是从0位置开始查找也就是从S3字符串的h开始查找。
rfind则是反向查找
4.4 substr
string substr (size_t pos = 0, size_t len = npos) const;
在str中从pos位置开始,截取n个字符,然后将其返回
这是一个很好玩的接口,从第n个字符开始截取字符串中m个字符返回赋予,当我们知道某个分字符串在总字符串中的位置的时候,就可以定向的将所知的分字符串赋予任意一变量

在string类中它充当的是字符串截取的功能
相关文章:
string函数以及string常用接口
本文介绍的是C关键字string中一些重要用法,以及各种字符串序列的处理操作 ——飘飘何所似,天地一沙鸥 文章目录前言一、string(字符串类)二、string类对象的容量操作2.1 size/length2.2 capacity2.3 empty/clear2.4 resize/reser…...
分享一篇由C语言实现《数据结构》无头无循环单链表
三月,你好,各位csdn uu们好 文章目录前言一、何为单链表二、单链表基本操作(增,删,查,改,销毁,遍历)1.查找与修改、销毁与遍历2.链表插入与删除操作三、单链表 VS 顺序表…...
C盘爆满?两个超简单的解决办法
我们在使用电脑的过程中,经常容易出现C盘爆红,反而其他盘还有大量可用空间的情况。为什么会这样呢?其实主要就两种原因:一是电脑使用习惯不好,不管什么软件都默认安装在C盘,大文件又喜欢放在桌面࿰…...
ThreadLocal
ThreadLocalThreadLocalMapgetsetremove内存泄漏key用强/弱引用entry继承了弱引用ThreadLocal 一个对象的所有线程会共享其全局变量——>线程不安全 解决方式: 方式一:同步机制,加锁(时间换空间) 方式二:…...
Java基础:JDK7-时间Date
JDK7以前时间相关类 1.Date Date date new Date(); , sout(date)得到的是现在所处位置的时间 Date date new Date(0L); , sout(date)得到的是时间原点也就是1970年1月1日08:00(东八区). date.setTime(1000L); sout(date)得到的是时间原点后一秒钟的时间 long time date.g…...
什么是IP地址?
IP协议中还有一个非常重要的内容,那就是给因特网上的每台计算机和其它设备都规定了一种地址,叫做“IP 地址”。由于有这种地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。…...
4年经验之谈,什么是接口测试?怎样做接口测试?
一、什么是接口?【文末学习资源分享】赶紧嫖!冲!!!! 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过…...
普通指针扫盲
一、什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。 CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存 中的一个指定数据…...
深度学习笔记:神经网络权重确定初始值方法
神经网络权重不可为相同的值,比如都为0,因为如果这样网络正向传播输出和反向传播结果对于各权重都完全一样,导致设置多个权重和设一个权重毫无区别。我们需要使用随机数作为网络权重 实验程序 在以下实验中,我们使用5层神经网络…...
关于 python 的异常使用说明 (python 的文件和异常)
文章目录异常1. 处理异常 ZeroDivisionError 异常2. 使用 try-except 代码块3. 使用异常避免崩溃4. else 代码块5. 处理 FileNotFoundError 异常6. 分析文本7. 失败时一声不吭异常 pyhong 使用被异常成为异常的特殊对象来管理程序执行期间发生的错误。 每当发生让 python 不知所…...
Spark RDD持久化
RDD Cache缓存 RDD通过Cache或者Persist方法将前面的计算结果缓存,默认情况下会把数据以序列化的形式缓存在JVM的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供…...
【Linux】Linux系统安装Python3和pip3
1.说明 一般来说Linux会自带Python环境,可能是Python3或者Python2,可能有pip也可能没有pip,所以有时候需要自己安装指定的Python版本。Linux系统下的安装方式都大同小异,基本上都是下载安装包然后编译一下,再创建好软…...
用java进行base64加密
首先定义一组密钥,加密和解密使用同一组密钥private final String key "hahahahahaha";也可以随机生成密钥/*** 生成随机密钥* param keySize 密钥大小推荐128 256* return* throws NoSuchAlgorithmException*/public static String generateSecret(int keySize) th…...
torch函数合集
torch.tensor() 原型:torch.tensor(data, dtypeNone, deviceNone, requires_gradFalse) 功能:其中data可以是:list,tuple,NumPy,ndarray等其他类型,torch.tensor会从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应类型的torch.Tenso…...
AcWing算法提高课-3.1.2信使
宣传一下算法提高课整理 <— CSDN个人主页:更好的阅读体验 <— 题目传送门点这里 题目描述 战争时期,前线有 nnn 个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。 信使负责在哨所之间传递信息,当然,…...
Paddle OCR Win 11下的安装和简单使用教程
Paddle OCR Win 11下的安装和简单使用教程 对于中文的识别,可以考虑直接使用Paddle OCR,识别准确率和部署都相对比较方便。 环境搭建 目前PaddlePaddle 发布到v2.4,先下载paddlepaddle,再下载paddleocr。根据自己设备操作系统进…...
杂谈:数组index问题和对象key问题
面试题一: var arr [1, 2, 3, 4] 问:arr[1] ?; arr[1] ?答:arr[1] 2; arr[1] 2 这里可以再分为两个问题: 1、数组赋值 var arr [1, 2, 3, 4]arr[1] 10; // 数字场景 arr[10] 1; // 字符串场景 arr[a] 1; // 字符串…...
三天Golang快速入门—Slice切片
三天Golang快速入门—Slice切片Slice切片切片原理切片遍历append函数操作切片append添加append追加多个切片中删除元素切片合并string和slice的联系Slice切片 切片原理 由三个部分构成,指针、长度、容量指针:指向slice第一个元素对应的数组元素的地址长…...
腾讯会议演示者视图/演讲者视图
前言 使用腾讯会议共享PPT时,腾讯会议支持共享用户使用演示者视图/演讲者视图,而会议其他成员可以看到正常的放映视图。下面以Win10系统和Office为例,介绍使用步骤。值得一提的是,该方法同时适用于单显示屏和多显示屏。 腾讯会议…...
【C++】类与对象(一)
文章目录1、面向过程和面向对象初步认识2、类的引入3、类的定义4、类的访问限定符5、类的作用域6、类的实例化7、计算类对象的大小8、this指针9、 C语言和C实现Stack的对比1、面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

