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'换行,你也可以指定结束字符。