前引:在现代软件开发中,字符串处理是几乎所有程序的核心需求之一。无论是文本解析、网络通信,还是用户交互,高效且安全的字符串操作能力直接决定了代码的质量与可维护性。而C++标准模板库(Standard Template Library, STL)中的 string 类,正是为这一需求而生——它既封装了底层字符数组的复杂性,又通过统一的接口提供了丰富的操作功能,成为C++开发者最常用的工具之一!
【string其实并没那么难!简单来说就是学习各种功能接口,希望此文对佬有所帮助,加油丫!】
目录
STL介绍
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架
String 是C++标准库中定义的字符串类的容器,属于<string>头文件,通过封装底层字符数字的复杂性,提供了一套安全、高效且易扩展的字符串操作接口
STL核心模块
STL包含三大核心模块:
(1)容器(比如 string、vextor、list、map、set........)
(2)算法(比如排序、查找、遍历.......)
(3)迭代器:类似指针(可能是指针,可能不是)的抽象工具,提供对容器元素的统一访问方式
为什么要学习String
首先比较直接的在笔试中对STL知识的运用很广泛,例如:
https://www.nowcoder.com/share/jump/1747468021126
其次在面试中对STL相关知识也考的比较多,例如:
对于C++程序员、面试者、工程师掌握STL都将显著提高我们的代码质量与开发体验~
String的使用规则
(1)string是表示字符串的字符串类
(2) 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
(3)string在底层实际是:basic_string模板类的别名,typedef basic_string string;
(4)不能操作多字节或者变长字符的序列。 在使用string类时,必须包含#include头文件以及 using namespace std(或者范围展开使用)
String的常用接口
构造函数
对于构造函数的功能,小编在之前已经出过文章仔细学习了,大家可以翻小编C++专栏笔记哦!
大家可以打开这个网站,里面详细介绍了容器里面的各种接口使用!主页搜索:string
(1)先包含#include<string>头文件
(2)全局展开/范围展开C++标准库
构造空对象
参数:无
形式:string ()
例如:
string S1;
构造字符对象
参数:字符串
形式:string string对象(const char* s)
例如:
string S2("hello word");
拷贝构造
参数:一个存在的string对象
形式:string string对象(string对象)
例如:
string S3(S2);
构造指定字符数量的对象
参数:字符串、字符个数(有效个数)
形式:string string对象(const char * s,size_t)
例如:
string S4("how are you", 7);
如果超过当前字符串个数,后面将是随机值,例如:
成员函数
尾插/尾删一个字符
参数:字符
形式:string对象 . push_back(char c)
(自动扩容)
尾删:pop_back
例如:
S2.push_back('*');
尾插一个字符串
参数:字符串
形式:string对象 . append(const char* s)
自动扩容
例如:
S2.append("WWWWWW");
输入运算符重载
参数:string 对象
形式:operator >> string对象
例如:
cin>>S2;
如果字符串中有空格,会作为结束的标志,例如:
输出运算符重载
参数:string对象
形式:cout << string对象
例如:
cout << S2
获取一行字符串
参数:输入运算符重载,string对象
形式:getline(cin,string对象)
例如:
其实就是升级版的“输入运算符重载”,会获取当前字符串的所有内容
getline(cin,S2);
关系操作/比较
参数:string对象,string对象
形式:string对象 关系符 string对象
例如:
S2 == S3;
S2 < S3;
S2 > S3;
S2 + S3;
S2 += S3;
S2 = S3;
获取pos位置的字符
参数:字符串对象的位置下标(跟操作数组一样)
形式:string对象 [下标]
例如:
S2[i]
它是可以直接修改内容的,例如:
如果换成 auto 自动推导类型也是可以的(需要用引用),因为 auto 底层是迭代器,例如:
计算有效字符长度
形式:string对象.size()
例如:
S2.size()
清楚有效字符
形式:string对象.clear()
例如:
S2.clear()
检测字符串是否为空串
形式:string对象.empty() (是则返回true,否则返回false)
例如:
S2.empty()
指定调整空间
形式:string对象.reserve(size_t)
扩容的大小只大于等于指定大小,不可能小于指定大小
如果第二次调整的空间小于第一次调整的空间,容量不会减少
例如:
S2.reserve(10)
reserve调容量规则:
如果预调容量之后会影响到原来已经存储的数据,则不会调小容量,例如:
如果预调容量之后不影响到原来已经存储的数据,则会调小容量,例如:
指定调整空间+初始化
形式: string对象.resize(size_t)
string对象.resize(size_t,char c)
如果 size_t 大于当前字符串长度,则将剩余的字符初始化为指定的内容,否则转为空格
如果 size_t 小于当前字符串长度,则缩短为其前 n 个字符,并删除超出第 n 个字符的字符
例如:
S2.resize(10);
S2.resize(5,'*')
S2.resize(12,'*')
调整规则:
如果给resize的值小于当前空间容量,resize不会去缩小容量,只会删除数据,例如:
指定位置插入数据
形式:string对象.insert(size_t,const char c) 指定位置插入指定字符串
形式:string对象.insert(size_t,size_t,char c) 指定位置插入指定数量的字符
例如:
注意:指定的位置受当前容量的影响
S2.insert(5,"hao are you");
S2.insert(10,5,'x');
指定位置删除数据
形式:string对象.erase(size_t) 删除指定位置之后的所有数据
string对象.erase(size_t,size_t) 删除指定位置开始的一定数量的数据
例如:
S2.erase(5);
S2.erase(0,1);
标记获取区间数据
这里通常是将两个成员函数:find+substr 结合起来用
find:标记一个字符/字符串/string对象,在对象中从头开始寻找标记地方,没有找到就返回 npos
substr:给一个区间,可以只写开始的位置,返回拷贝这个区间的新对象
例如:
用 find 标记一个初始位置,如果找到这个标记的地方,substr 根据区间拷贝构造一个新对象
判断一个字符是不是字母
形式:isalpha(char c)
c是字母返回非0,否则返回0
例如:
判断一个字符是不是字符数字
形式:isdigit(char c)
返回0表示不是数字,非0表示是字符数字
例如:
大小写字符的相互转化
形式:toupper(char c)
和tolower(char c)
小转大 大转小
例如:
删除指定字符
形式:erase(remove(str.begin(), str.end(), ch), str.end())
例如:
逆置字符串
形式:reverse(string对象.begin() , string对象.end())
例如:
整型数字转字符串
形式:string对象 = to_string(数字)
例如:
迭代器访问
迭代器:
一种设计模式,用于遍历集合中的元素,而无需暴露集合的内部结构。它提供了一种统一的方式来访问集合中的元素,无论集合的具体实现是什么(想象为一种访问工具)
优势:
迭代器(iterator)提供一种统一的方式访问和修改容器的数据(需要注意在函数中的使用只能访问,且在指定位置加上 const ,否则会报错)
因此算法就可以通过迭代器,去处理容器中的数据
迭代器顺序获取字符
如图:
形式:
迭代器逆序获取字符
图示:
例如:
迭代器在函数中顺序获取字符
使用:在迭代器前面加上 const 修饰,只能访问不能修改数据
例如:
迭代器在函数中逆序获取字符
使用:在迭代器前面加上 const_ 修饰,只能访问不能修改数据
例如:
【雾非雾】期待与你的下次相遇!