C++入门小馆: 深入string类
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!
我的博客:yuanManGan
我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 题山采玉 领略算法真谛

目录
1.为什么我们要学习string类?
2.标准库中的string类
2.1string类(了解)
2.2 auto和范围for
auto 关键字:
范围for
2.3 string类的常用接口说明
1. string类对象的常见构造
2. string类对象的容量操作
3. string类对象的访问及遍历操作
4. string类对象的修改操作
5. string类非成员函数
我们学习一个类或者STL,都要经历几个过程,先了解一个类怎么使用,了解里面最常用的接口,了解一个类的底层怎么实现的,根据自己的理解优化改造类。一般能到第二部就很不错了。
1.为什么我们要学习string类?
回想一下我们在c语言中怎么存储字符串呢?没错就是字符数组,还提供了很多关于str的库函数但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。
2.标准库中的string类
2.1string类(了解)

2.2 auto和范围for
auto 关键字:
auto关键字用来作为一个新的类型标识符,可以用auto来声明变量,auto声明的变量必须由编译器推导而来。简而言之auto用来声明的变量会自动匹配你给的右值的类型。

比如这个x变量的类型就是int类型。
当我们想用auto来自动匹配指针类型时我们使用auto和auto*是一个意思,没有区别,但我们用auto声明引用类型时必须加&。


auto不能作为函数的参数,可以做返回值,但建议谨慎使用


我们使用auto声明变量时,必须要进行初始化

如果使用auto一次声明多个变量时,变量的类型必须一致。

auto类型不能声明数组变量

有人问了这个有什么用啊,我自己知道变量类型,那我用这个干嘛啊,不要紧我们学到后面又它的用武之地,我们不要因为自己学习的不够深入就否定这个玩意。
范围for
范围for的作用是对一个有范围的集合进行遍历,用法是for(类型 变量 : 集合),第一部分也就是冒号前面的是用于迭代的变量,第二部分则是范围。
范围for可以对数组和容器对象进行遍历:

2.3 string类的常用接口说明
(注意下面我只讲解最常用的接口)
1. string类对象的常见构造
|    (constructor) 函数名称    |    功能说明    | 
|    string()  (重点)    |    构造空的 string 类对象,即空字符串    | 
|    string(const char* s)  (重点)     用    |    用 C-string 来构造 string 类对象    | 
|    string(size_t n, char c)    |    string 类对象中包含 n 个字符 c    | 
|    string(const string&s)  (重点)     拷    |    拷贝构造函数    | 

当然string类型我们对它的<<运算符也进行了重载。
2. string类对象的容量操作
| 函数名称 | 功能说明 | 
| size(重点) |    返回字符串有效字符长度    | 
| length | 返回字符串有效字符长度 | 
|    capacity    | 返回空间总大小 | 
|    empty  (重点)    | 检查字符串是否为空串,是返回true,不是返回false | 
|    clear  (重点)    | 清空有效字符 | 
|    reserve  (重点)    | 为字符预留空间 | 
|    resize  (重点)    | 将有效字符个数改为n个,多余的字符用c填充 | 
有心细的宝宝发现length和size的功能是一样的,然后它的底层实现其实也是一样的。length是由于历史的原因,string存在的历史很久,然后为了和STL里面的类的保持一致所以有了size,后者更常用一点。
前三个

empty,clear:
 reserve

这里扩容的规则,以后再慢慢讲。
resize

这里resize之后的s后面全是'\0' 。

注意:
clear只是将string中的有效字符清除,不改变底层空间大小。
resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数 增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
3. string类对象的访问及遍历操作
|    函数名称    |    功能说明    | 
|    operator[] (重     点)    |    返回 pos 位置的字符, const string 类对象调用    | 
|    begin +  end    |    begin 获取一个字符的迭代器  +  end 获取最后一个字符下一个位     置的迭代器    | 
|    rbegin  +  rend    |    begin 获取一个字符的迭代器  +  end 获取最后一个字符下一个位     置的迭代器    | 
|    范围 for    |    C++11 支持更简洁的范围 for 的新遍历方式    | 

这里就可以使用auto来声明就很舒服 。
4. string类对象的修改操作
|    函数名称    |    功能说明    | 
| push_back |   在字符串后面加个字符c  | 
| append | 在字符串后面追加一个字符串 | 
| operator+= | 在字符串后可追加字符或者字符串 | 
| c_str | 返回C格式字符串 | 
| find + npos | 从字符串pos位置开始找字符c,返回该字符在字符串中的位置 | 
| rfind | 从字符串pos位置开始反着找。 | 
| substr | 在str中从pos位置开始,截取n个字符,然后将其返回 | 
 
 
 
 
 
 5. string类非成员函数
| 函数 | 功能说明 | 
| operator>> | 输入运算符重载 | 
| operator<< | 输入运算符重载 | 
| getline | 获取一行字符串 | 
| operator+ | 尽量少用,因为传值返回,导致深拷贝效率低 | 
| relational operator | 大小比较 | 

我们发现我们输入空格或者换行时,cin就会停止读取,那我们真的想要读取空格字符该怎么办呢?这是就该我们的getline出场了。
 
getline函数有两个重载,第一个参数都是输入流,即cin,第二个参数是string类型,第三个参数就重要了,如果不传的话就是默认'\n'换行,你也可以指定结束字符。
 


