- 1. 为什么要学习string类
- 2. 标准库中的string类
- 3. string类的模拟实现
- 4. 扩展阅读
1. 为什么学习string类?
1.1 C语言中的字符串
在c语言中没有string类型只有char类型,char类型只能是一个字符非常的不好用,想要字符串还必须要弄一个char的数组非常的容易越界出现随机值
string就是字符串,string类其实就是在原来的基础上添加了增删查改扩容这些东西的,c语言里面的不符合面向对象编程
1.2 两个面试题(暂不做讲解)
牛客网-题目已下线_牛客网 (nowcoder.com)
. - 力扣(LeetCode)
2. 标准库中的string类
2.1 string类(了解)
cplusplus.com/reference/string/string/?kw=string
2.2 string类的常用接口说明(注意下面我只讲解最常用的接口)
sting类的默认成员函数
(1) empty string constructor (default constructor)
(1)默认构造函数
Constructs an empty string, with a length of zero characters.
构造一个长度为零个字符的空字符串。
(2) copy constructors
(2) 复制构造函数
3) substring constructor
(3) 子字符串构造函数
Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is basic_string::npos).复制从字符位置 pos 开始并跨越 len 字符的 str 部分(或者直到 str 的末尾,如果 str 太短或 len 为 basic_string::npos)。
这里要注意的是 下标是从0开始
注意看这里len是缺省参数,
这里就可以理解成假如没有写这个参数就把后面所有的都拷贝过来,有多少拷多少
如果第三个参数明显大于被拷贝的,那么也是有多少烤多少
他的底层就类似于拷贝到char数组的/0,然后就停止拷贝
(4) from c-string
(4) 从 C 字符串
(5) from buffer
(5) 来自缓冲区
Copies the first n characters from the array of characters pointed by s.
从 s 指向的字符数组中复制前 n 个字符。
这里的第一个参数必须是要是在代码段上面的字符串
如果这里采用变量的形式就会和第四个冲突
和第四个的缺省会产生冲突
(6) fill constructor
(6) 填充构造函数
string的赋值重载=这里给提供了三种
3.string的赋值 

4.string的底层
string的底层其实就是char数组封装成了类
它可以直接用下标直接修改访问
5.迭代器(iterator)
如果想遍历一个字符串我们可以这样
用下标的方式遍历
还可以用迭代器来遍历
这样也可以用来遍历,这里可以把迭代器理解成string类中是char的数组,那么这里面每一个char的地址就是迭代器,然后我们让string++是无法完成这种功能的
熟悉了以后可以直接这样写
但是这里并不一定是一个指针 ,只是可以这样理解
迭代器可以用在后面的二叉树和链表里面
范围for的底层其实就是迭代器
6.反向迭代器
如果想反着遍历一个字符串显然auto就不够用用了这里就需要用反向迭代器了
7.排序
如果想给一个string排序(给char的数组按字典序排序)
只排序前俩个
8.string的尾插
这里有做限制只能插入一个字符不能插入字符串双引号下就不行
如果要添加字符串要用append
但是这俩种都不好用,string还提供了运算符重载
9.string的尾删
这里只可以删除一个字符
如果要删除一段字符的话需要 用erase
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 删除从索引5开始的所有字符
str.erase(5);
std::cout << str << std::endl; // 输出: Hello
// 重新赋值
str = "Hello, World!";
// 删除从索引5开始的7个字符
str.erase(5, 7);
std::cout << str << std::endl; // 输出: Hello!
// 重新赋值
str = "Hello, World!";
// 删除从索引5到索引12的字符
str.erase(str.begin() + 5, str.begin() + 12);
std::cout << str << std::endl; // 输出: Hello!
return 0;
}