C++入门7--string类详解
创作初心:在加深个人对知识系统理解的同时希望可以帮助到更多需要的同学
🛠️柯一梦主页详情
座右铭:心向深耕,不问阶序;汗沃其根,花自满枝。
string既然作为一个类那么我们就不得不提一提它的成员变量和成员函数了
Mumber functions成员函数:
constructor(构造函数):

string():默认构造函数。
string(const string& str):拷贝构造函数(拷贝构造里面用的是引用传递,引用传递可以省去很多麻烦,比如说开辟空间)。
string(const char*s):用C语言的string来构造c++语言的string。我们来讲一下c语言的string和c++的string有啥区别。c语言的string的本质就是一个字符数组,不能任意修改长度,还存在访问越界的问题;c++的string是一个包含了很多功能的类。
赋值运算符重载operator=:

第一个重载:赋值的对象是一个字符串
第二个重载:赋值的对象是一个c语言的字符数组
第三个重载:赋值的对象是一个字符
迭代器函数:

迭代器:是一种抽象的指针。为 容器 提供了一个统一的接口,让我们不依赖容器内部,可以灵活的遍历,修改容器内的内容
begin:就是返回字符串第一个字符的迭代器。
end:返回字符串最后一个字符后一个的迭代器。
rbegin:返回字符串最后一个字符的反向迭代器。
rend:返回第一个字符前面的反向迭代器(反向迭代器的++操作是向前移动)。
cbegin:返回一个常量正向迭代器(就是不能修改容器里面的内容,注意:这样的迭代器的返回值需要用string::const_string接收),指向容器里面的第一个元素。
cend:返回一个常量着呢恭喜那个迭代器,指向容器里面最后一个元素的下一个位置
rbegin与rend仿照上面的同理。
capacity(容量板块,主要用于管理字符串的实际长度和底层存储空间):

size与length:返回字符串的实际长度,不包含”/o”,他们两个的用法一致,但是由于历史原因,length出现的比较早,但是不适配其他的容器,size就适合其他的各种容器,降低了学习成本。
resize:resize有两个版本:1、resize(size_t n):调整string的大小 2、resize(size_t,char c):调整大小的同时,用传入的字符填补空位置。 我们来详细的讲一下这个resize里面的参数n与sizeof和capacity的关系
- n<size:只保留前n个字符,把多余n的字符全部都截掉
- size<n<capacity:将实际的字符长度扩展到n,并且用你传入的字符填充
- n>capacity:会触发扩容机制
capacity:返回string已分配的总空间的总大小
reserve:使用:reserve(size_t n),提前预留n大小的capacity,如果n>当前的capacity就扩容 n<当前的capacity,不强制改变
clear:清空有效字符,但是不改变capacity的大小(因为空间不能一块一块的增加或者减少,所以一般清除数据不会缩容,真正的缩容函数是shrink,他的底层是开辟一块新的空间,代价很大)
empty:检测字符串是否为空串,是的话返回True,否则返回false
shrink:回收冗余的空间。没有多余的参数,就是把capacity的大小调整到比size多一点
ELement access(元素访问板块):

operator[]:返回的是pos位置字符的引用,所以它既能访问字符又能修改字符(如果我们使用operator[]去遍历一个string对象,我们需要先用size去获得该字符串的大小,然后再使用for循环或者是什么去遍历string对象)
at:返回的也是pos位置的字符的引用,但是它会去1、判断pos是否越界,也就是会拿pos和size作比较。 2、如果对象是const,他也会自动匹配
back和front:back和front顾名思义就是返回第一个和最后一个位置的字符的引用,如果对象是仅读的,就不能修改。
Modifiers(修改字符串里面的内容):
operator+=:操作对象可以是一个string的对象,也可以是一个字符,也可以是一个c语言的字符串。用起来非常方便
append:有很多个接口,主要功能就是添加一个额外的字符串到当前的string对象后面。可以提的是:append可以添加(常量的)string对象,也可以添加(常量的)c语言式的字符串数组。
push_back:push_back的参数只有一个,那就是字符,并不能添加字符串。
assign:就是给string对象赋值。有的同学可能就好奇了,为什么已经有了operator=还要搞assign呢,其实assign和operator有本质区别,那就是assign可以对操作的对象进行精细的调控(也就是可以控制赋值多少,也可以用N个字符填充)。
insert和erase:insert的功能强大之处在于可以在字符串的任何一个部位插入字符串,迭代器范围的内容,或者是string对象。erase有好几个接口,可以提供起始位置和末位置让其进行删除,也可以提供迭代器范围让编译器进行删除
pop_back:就是删除字符串的最后一个字符。
swap:string里面的swap就是交换俩个string对象里面的内容而且非常高效
replace:替换字符串中特定片段的工具。
find和rfind:find可以在字符串里进行搜索string对象,也可以搜索字符,最主要的一点是可以指定从哪里开始搜索,rfind是从字符串的末尾倒着开始寻找
c_str:将一个string类型的对象返回成c语言型的字符串


