C++之STL库:string类(用法列举和总结)
前言
大家在学习STL库的时候一定要学会看英文文档,俗话说熟能生巧,所以还得多练!在使用string类之前,要包含头文件#include <string>和using namespace std;
文档链接:string - C++ Reference
一、string——构造相关操作
1. string(); (常用)
构造一个空字符串
string s1;
2. string(const char *s); (常用)
使用字符串构造一个实例化对象
string s2("hello world");
3. string(const string& str); (常用)
使用string的实例化对象去拷贝构造另外一个实例化对象
string s2("hello world");
string s3(s2);
4. string& operator=(const string& str); (常用)
string s2("hello world");
string s4 = s2;
5. string& operator=(const char *s); (常用)
string s5 = "hello world";
6. string& operator=(char c);
这里有一点需要注意,赋值运算符重载和拷贝构造的区别,两个对象都是定义之后的=是赋值运算符重载,如果是在定义的时候的=,属于拷贝构造;
所以代码1是不正确的:因为这是拷贝构造,而在拷贝构造这里,没有将一个字符拷贝给string类的函数实现

正确的写法:
string s6;s6 = 'x';

7. string (const string& str, size_t pos, size_t len = npos);
拷贝str,在pos的下标开始,拷贝len个长度。
string s7 = "hello world";
string s8(s7, 0, 3);

8. string (const char* s, size_t n);
从s上拷贝前n个字符
string s9("hello world", 4);

9. string (size_t n, char c);
拷贝n个一样的字符
string s10(10, 'x');

10. string (InputIterator first, InputIterator last);
用迭代器拷贝,first为头,last为尾,拷贝first<= string <last,也就是拷贝从first位置开始,在last前一个位置停下来,不拷贝last位置;(默认迭代器的end是在\0位置)
string s11 = "hello world";string s12(s11.begin(), s11.end()-1);

二、string——打印相关操作
1. 输入字符串cin
可以从键盘上输入字符串,但是遇到空格就结束输入
string s1;cin >> s1;cout << s1 << endl;
2. 输出字符串cout
将字符串的内容打印到显示器上
3. 获取字符串getline
从流中获取字符串,输入空格不会停止
string s1;getline(cin, s1);cout << s1 << endl;
三、string——访问和遍历相关操作
1. char& operator[] (size_t pos);
通过下标访问字符串元素
string s1 = "hello world";cout << s1[0] << endl;
2. char& at (size_t pos);
跟下标访问一样,只是报错的方式不同;
string s1 = "hello world";cout << "字符串第5个字符为:" << s1.at(4) << endl;

3. iterator begin();和 iterator end();
begin获取字符串第一个字符的迭代器(可以理解取第一个字符的地址)
end获取最后一个字符的下一个位置的迭代器(可以理解取最后一个有效字符下一个位置的地址)
string s1 = "hello world";string::iterator begin = s1.begin(); string::iterator end = s1.end();
可以像指针那样的遍历
string s1 = "hello world";string::iterator begin = s1.begin();string::iterator end = s1.end();while(begin < end){cout << *begin << ' ';++begin;}cout << endl;
也可以访问第几个位置的元素,但是一般用下标访问了
string s1 = "hello world";string::iterator begin = s1.begin();string::iterator end = s1.end();cout << "访问第1个元素为:" << *begin << endl;cout << "访问第5个元素为:" << *(begin + 4) << endl;cout << "访问倒数第3个元素为:" << *(end - 3) << endl;
4. reverse_iterator rbegin();和 reverse_iterator rend();
rbegin:指向的是最后一个有效字符的迭代器,从后往前访问;
rend:指向的是第一个字符之前的迭代器,从前往后访问;
string s1 = "hello world";string::reverse_iterator rb = s1.rbegin();string::reverse_iterator re = s1.rend();while(rb < re){cout << *rb << ' ';++rb;}
5. 范围for遍历
很简洁,但是底层依旧是迭代器;
string s1 = "hello world";for(auto e : s1){cout << e << ' ';}cout << endl;

四、string——容量相关操作
1. size
计算字符串的长度,以字节为单位
string s1 = "hello world";
int len = s1.size();
cout << len << endl;
2. capacity
返回当前为字符串已经分配的空间大小,以字节为单位,这个空间表示出来的是给有效字符存的空间;
但是实际的空间大小是比capacity表示出来的多一个空间,是存\0的;
分配的空间会大于字符串的size,但是分配的空间有可能不同,这取决于不同的编译器;
string s1 = "hello world";
cout << s1.capacity() << endl;
3. empty
判断字符串是否为空串:为空返回true(非0),不为空,返回false(0)
string s1 = "hello world";cout << s1.empty() << endl;string s2;cout << s2.empty() << endl;

4. clear
只清空字符串的有效内容,不销毁空间;清空内容之后,size为0,capacity不变
string s3 = "hello world";cout << "清空之前的容量:" << s3.capacity() << endl;cout << "清空之前的长度:" <<s3.size() << endl;s3.clear();cout << "清空之后的容量:" << s3.capacity() << endl;cout << "清空之后的长度:" <<s3.size() << endl;
5. reserve
为字符串保留空间
规则:
1. 扩容:当保留的空间 > capacity,认为扩容。每个编译器扩容的空间是不同的,总体上看就是:实际扩容下的空间≥要保留的空间;
2. 缩容:当保留的空间 < capacity ,认为缩容。有的编译器不会缩容,有的编译器会缩容,如果保留的空间<size,只缩容到size大小。
string s4 = "hello world";cout << "扩容之前的容量:" << s4.capacity() << endl;s4.reserve(100);cout << "扩容之后的容量:" << s4.capacity() << endl;

string s4 = "hello world";cout << "缩容之前的容量:" << s4.capacity() << endl;s4.reserve(2);cout << "缩容之后的容量:" << s4.capacity() << endl;
6. resize
void resize (size_t n);
void resize (size_t n, char c);
将有效字符的个数该成n个;
n > capacity :size = n ,capacity ≥ n,若提供c,则后面全为c字符,若没提供,则为‘\0’;并不是\0就是无效字符,对于有效字符的设定是根据在0~size-1之间的都是有效字符;
string s5 = "hello world";cout << s5 << endl;cout << "调整有效字符之前的容量:" << s5.capacity() << endl;cout << "调整有效字符之前的长度:" <<s5.size() << endl;s5.resize(30);cout << s5 << endl;cout << "调整有效字符之后的容量:" << s5.capacity() << endl;cout << "调整有效字符之后的长度:" <<s5.size() << endl; 
string s5 = "hello world";cout << s5 << endl;cout << "调整有效字符之前的容量:" << s5.capacity() << endl;cout << "调整有效字符之前的长度:" <<s5.size() << endl;s5.resize(30, 'x');cout << s5 << endl;cout << "调整有效字符之后的容量:" << s5.capacity() << endl;cout << "调整有效字符之后的长度:" <<s5.size() << endl;

size < n < capacity ,size = n,capacity不变;若提供c,则后面全为c字符,若没提供,则为‘\0’;
n < size ,size = n ,删数据,保留前n个有效字符,capacity不变;
五、string——增加操作
1. string& operator+= (char c);
尾插字符
string s1 = "hello world";cout << s1 << endl;s1 += 'x';cout << s1 << endl;
2. string& operator+= (const string& str);
尾插字符串
string s1 = "hello world";cout << s1 << endl;s1 += s1;cout << s1 << endl;
3. string& operator+= (const char* s);
尾插字符串
string s1 = "hello world";cout << s1 << endl;s1 += " hello CSDN";cout << s1 << endl;
4. string& insert (size_t pos, const string& str);
在pos位置之前插入字符串
string s1 = "hello world";string s2 = "CSDN";cout << "插入之前:" << s1 << endl;s1.insert(1, s2);cout << "插入之后:" << s1 << endl;
更多的应用:string::insert - C++ Reference
六、string——删除操作
1. string& erase (size_t pos = 0, size_t len = npos);
从pos位置删字符,删 len个字符;
npos代表-1,len为size_t类型,为无符号类型,就会被转换为整型的最大值,所以len为整型最大值,在不提供实参,就默认为npos;
string s1 = "hello world";cout << "删除之前:" << s1 << endl;s1.erase(1,3);cout << "删除之后:" << s1 << endl;

2. iterator erase (iterator p);
删除迭代器所处的位置的字符
string s1 = "hello world";cout << "删除之前:" << s1 << endl;s1.erase(s1.begin());cout << "删除之后:" << s1 << endl;

3. iterator erase (iterator first, iterator last);
删除两个迭代器之间的字符,包括first,不包括last,[first, last)
string s1 = "hello world";cout << "删除之前:" << s1 << endl;s1.erase(s1.begin(), s1.end()-1);cout << "删除之后:" << s1 << endl;
七、string——查找操作
| 在pos位置向后查找str这个string类的对象,返回找到的字符串的第一个位置的下标,没找到就返回npos | size_t find (const string& str, size_t pos = 0) const; |
|---|---|
| 在pos位置向后查找s这个字符串,返回找到的字符串的第一个位置的下标,没找到就返回npos | size_t find (const char* s, size_t pos = 0) const; |
| 在pos位置向后找,找s的前n个字符,找到返回第一个位置的下标,找不到返回npos | size_t find (const char* s, size_t pos, size_t n) const; |
| 在pos位置向后查找字符c,返回找到的字符位置的下标,没找到就返回npos | size_t find (char c, size_t pos = 0) const; |
具体查看:hstring::find - C++ Reference
rfind就是从后往前找
八、string——构造子串

意思就是构造一个子串,从pos位置开始,往后len个字符都构造;
string s2 = "hello world";size_t n = s2.find('w', 0);string s3 = s2.substr(n,s2.size() - n);cout << s2 << endl;cout << s3 << endl;
九、string——比较操作
大家试着去官网去查查,一定要熟悉英文文献哦~
relational operators (string) - C++ Reference
相关文章:
C++之STL库:string类(用法列举和总结)
前言 大家在学习STL库的时候一定要学会看英文文档,俗话说熟能生巧,所以还得多练!在使用string类之前,要包含头文件#include <string>和using namespace std; 文档链接:string - C Reference 一、string——构造…...
小程序中的大道理--综述
前言 以下将用一个小程序来探讨一些大道理, 这些大道理包括可扩展性, 抽象与封装, 可维护性, 健壮性, 团队合作, 工具的利用, 可测试性, 自顶向下, 分而治之, 分层, 可读性, 模块化, 松耦合, MVC, 领域模型, 甚至对称性, 香农的信息论等等. 为什么不用大程序来说大道理呢? …...
tlais智能学习辅助系统-修改部门功能实现
学习黑马程序员的JavaWeb课程,自己写的部门信息修改部分程序 控制层: //DeptController.java /** * 根据ID查询部门信息 * param id * return */ GetMapping("/{id}") public Result select(PathVariable Integer id){log.info("查询id…...
GLM: 自回归空白填充的多任务预训练语言模型
当前,ChatGLM-6B 在自然语言处理领域日益流行。其卓越的技术特点和强大的语言建模能力使其成为对话语言模型中的佼佼者。让我们深入了解 ChatGLM-6B 的技术特点,探索它在对话模型中的创新之处。 GLM: 自回归空白填充的多任务预训练语言模型 ChatGLM-6B 技…...
函数递归所应满足的条件
1.递归的概念 递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。 递归的思想: 把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但…...
Python入职某新员工大量使用Lambda表达式,却被老员工喷是屎山
Python中Lambda表达式是一种简洁而强大的特性,其在开发中的使用优缺点明显,需要根据具体场景权衡取舍。 Lambda表达式的优点之一是它的紧凑语法,适用于一些短小而简单的函数。这种形式使得代码更为精炼,特别在一些函数式编程场景中,Lambda表达式可以提高代码的表达力。此外…...
Android Bitmap保存成至手机图片文件,Kotlin
Android Bitmap保存成至手机图片文件,Kotlin fun saveBitmap(name: String?, bm: Bitmap) {val savePath Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()if (!Files.exists(Paths.get(savePath))) {Log.d("保存文…...
frp V0.52.3 搭建
下载 https://github.com/fatedier/frp/releases/ 此版本暂时没有windows的,想在windows使用请下载v0.52.2 简易搭建 frps.toml的配置文件,以下12000、8500需要在云服务器中的防火墙中开放tcp # bindPort为frps和frpc通信的端口,需要在防…...
最近数据分析面试的一点感悟...
我是阿粥,也是小z 最近面了不少应届的同学(数据分析岗位),颇有感触,与各位分享。 简历可以润色,但要适度 运用一些原则,如STAR法则,让简历逻辑更清晰,条块分明࿰…...
ZYNQ_project:IIC_EEPROM
EEPROM简介: EEPROM(Electrically Erasable Progammable Read Only Memory, E2PROM)是指带电可擦可编程只读存 储器,是一种常用的非易失性存储器(掉电数据不丢失), E2PROM 有多种类型的产品,我…...
Leetcode 2940. Find Building Where Alice and Bob Can Meet
Leetcode 2940. Find Building Where Alice and Bob Can Meet 1. 解题思路2. 代码实现3. 算法优化 题目链接:2940. Find Building Where Alice and Bob Can Meet 1. 解题思路 这一题本质上又是限制条件下求极值的问题,算是我最不喜欢的题目类型之一吧…...
C++ 泛型编程,函数模版和类模版
1.泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 就比如说活字印刷术,就是提供一个模具,然后根据模具来印刷出不同的字。 泛型编程跟着类似,提供一个模版,根据这…...
【封装UI组件库系列】封装Button图标组件
封装UI组件库系列第四篇封装Button按钮组件 🌟前言 🌟封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性: 支持的事件: 2.创建Button组件 🌟封装功能属性 type主题颜色 plain是否朴素 loading等…...
windows系统mobaxterm远程执行linux上ssh命令
命令如下 start "" "%~dp0\MobaXterm_Personal_23.4.exe" -newtab "sshpass -p root ssh root192.168.11.92 mkdir 33" -p 是密码 左边是用户名,右边是服务器ip 后面跟的是服务器上执行的命令 第一次执行的时候要设置mobaxt…...
debian 12 配置
1. 修改apt源 修改apt源为http版本 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/d…...
AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程
一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…...
Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器
Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js Axios官方中文文档 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支…...
git提交报错error: failed to push some refs to ‘git url‘
1.产生错误原因 想把本地仓库提交到远程仓库,报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因: 我们在创建仓库的时候,都会勾选“使用Reamdme文件初始化…...
【Python】(自定义函数)模块的相对路径导入
是我以前写的老文章的升级版,本质上使用exec和sys.path实现相对路径导入。 RelativeImport: __version__1.1.0 __author__Ls_Janimport os import sys import inspectdef RelativeImport(module,*args):#模块导入module为模块所在路径(模块名不需要.py后…...
巧妙之中见真章:深入解析常用的创建型设计模式
设计模式之创建型设计模式详解 一、设计模式是什么?二、模板方法2.1、代码结构2.2、符合的设计原则2.3、如何扩展代码2.4、小结 三、观察者模式3.1、代码结构3.2、符合的设计原则3.3、如何扩展代码3.4、小结 四、策略模式4.1、代码结构4.2、符合的设计原则4.3、如何…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...


















