C++入门小馆: 深入string类
嘿,各位技能潮人!好久不见甚是缅怀。生存就像一场奥妙冒险,而编程就是那把超酷的全能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。预备好和我一起冲进代码的奇幻宇宙了吗?Let's go!https://i-blog.csdnimg.cn/direct/87d75525b9284470b7e09a0a8510470c.gif
我的博客:yuanManGan
我的专栏:C++入门小馆 C言雅韵集 数据布局漫游记 闲言碎语小记坊 题山采玉 明白算法真谛
https://i-blog.csdnimg.cn/direct/d60450a5f7d34fdc8ee1ec9ec31d81f3.gif
目次
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类(相识)
string类的文档先容 这个网站有很多类的库函数的使用和实例,可以收藏起来,但这个网站,并不是C++官方的网站,而是几个有志青年觉得官网并不好,而做出来的网站。https://i-blog.csdnimg.cn/direct/b31023c16a9f4856a919d3ca64796001.png
2.2 auto和范围for
在C++11中多了两个功能,一个是auto关键字,一个是范围for。 auto 关键字:
auto关键字用来作为一个新的范例标识符,可以用auto来声明变量,auto声明的变量必须由编译器推导而来。简而言之auto用来声明的变量会主动匹配你给的右值的范例。
https://i-blog.csdnimg.cn/direct/162e558c95084048a79bc14254f34bc5.png
好比这个x变量的范例就是int范例。
当我们想用auto来主动匹配指针范例时我们使用auto和auto*是一个意思,没有区别,但我们用auto声明引用范例时必须加&。
https://i-blog.csdnimg.cn/direct/85847afaf24d4934a1a126a2804a30a1.png
https://i-blog.csdnimg.cn/direct/ae2bd5d4f5024ee7b9b2fc046871fefa.png
auto不能作为函数的参数,可以做返回值,但建议谨慎使用
https://i-blog.csdnimg.cn/direct/fb8b4f019c76413b8141fd013637cb1e.png
https://i-blog.csdnimg.cn/direct/dcb24056dfa1458cb3e29412fd9c824d.png
我们使用auto声明变量时,必须要举行初始化
https://i-blog.csdnimg.cn/direct/5cd3c6d5105244b1885ec6d871f390df.png
如果使用auto一次声明多个变量时,变量的范例必须同等。
https://i-blog.csdnimg.cn/direct/7db2b3b71f5d4a5eb57b778d01fc0a26.png
auto范例不能声明数组变量
https://i-blog.csdnimg.cn/direct/4632d325ad284851aede0423caa6813e.png
有人问了这个有什么用啊,我自己知道变量范例,那我用这个干嘛啊,不要紧我们学到后面又它的用武之地,我们不要因为自己学习的不敷深入就否定这个玩意。
范围for
范围for的作用是对一个有范围的集合举行遍历,用法是for(范例 变量 : 集合),第一部分也就是冒号前面的是用于迭代的变量,第二部分则是范围。
范围for可以对数组和容器对象举行遍历:
https://i-blog.csdnimg.cn/direct/6367bf9bb1894e249d02cf86db42f9b6.png
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) (重点) 拷 拷贝构造函数 https://i-blog.csdnimg.cn/direct/b29c5e0e2f234e4cb52905cd5f39f9fb.png
当然string范例我们对它的<<运算符也举行了重载。
2. string类对象的容量操纵
函数名称功能说明size(重点) 返回字符串有效字符长度 length返回字符串有效字符长度 capacity 返回空间总大小 empty (重点) 查抄字符串是否为空串,是返回true,不是返回false clear (重点) 清空有效字符 reserve (重点) 为字符预留空间 resize (重点) 将有效字符个数改为n个,多余的字符用c填充有心细的宝宝发现length和size的功能是一样的,然后它的底层实现着实也是一样的。length是由于汗青的缘故起因,string存在的汗青很久,然后为了和STL里面的类的保持同等所以有了size,后者更常用一点。
前三个
https://i-blog.csdnimg.cn/direct/110870034b8f4485a5f0613646bb9911.png
empty,clear:
https://i-blog.csdnimg.cn/direct/190d015242ae472f9eb08d458fb540ca.png reserve
https://i-blog.csdnimg.cn/direct/5074cd827ada4b38a2bb8a5d4614aa13.png
这里扩容的规则,以后再慢慢讲。
resize
https://i-blog.csdnimg.cn/direct/41f23155bb7c4b14bf796f000d37382c.png
这里resize之后的s后面全是'\0' 。
https://i-blog.csdnimg.cn/direct/c10a4fbacdd54b349feecfba5de7ebda.png
注意:
clear只是将string中的有效字符打扫,不改变底层空间大小。
resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数 增多,大概会改变底层容量的大小,如果是将元素个数减少,底层空间总大小稳固。
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参 数小于string的底层空间总大小时,reserver不会改变容量大小。 3. string类对象的访问及遍历操纵
函数名称 功能说明 operator[] (重 点) 返回 pos 位置的字符, const string 类对象调用 begin + end begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位 置的迭代器 rbegin + rend begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位 置的迭代器 范围 for C++11 支持更简便的范围 for 的新遍历方式 https://i-blog.csdnimg.cn/direct/472b9de864ef424d95e1f6f3bf09f575.png
这里就可以使用auto来声明就很惬意 。
4. string类对象的修改操纵
函数名称 功能说明 push_back 在字符串后面加个字符c
append 在字符串后面追加一个字符串operator+=在字符串后可追加字符或者字符串c_str返回C格式字符串find + npos从字符串pos位置开始找字符c,返回该字符在字符串中的位置rfind 从字符串pos位置开始反着找。substr在str中从pos位置开始,截取n个字符,然后将其返回 push_back https://i-blog.csdnimg.cn/direct/98e27ba73b0949d9a2159213478ed06f.png append https://i-blog.csdnimg.cn/direct/fdbcbec2637e461394236a28a8ee0208.png operator+= https://i-blog.csdnimg.cn/direct/08e9db3260434a07a1e6268137f0cabb.png c_str https://i-blog.csdnimg.cn/direct/8884e8824ca548b79a7ddfa79edf8441.png find https://i-blog.csdnimg.cn/direct/4b78945b0e46448997c98eb65e9b356d.png substr https://i-blog.csdnimg.cn/direct/f910a566a55948b6b40318899232f428.png 1. 在 string 尾部追加字符时, s.push_back(c) / s.append(1, c) / s += 'c' 三种的实现方式差 不多,一样平常环境下 string 类的 += 操纵用的比较多, += 操纵不但可以连接单个字符,还可 以连接字符串。 2. 对 string 操纵时,如果可以大概大概预估到放多少字符,可以先通过 reserve 把空间预留 好。 更加具体,更加详细的讲解在文档里,可以自己查阅,这里就不逐一赘述了。 5. string类非成员函数
函数功能说明operator>>输入运算符重载operator<<输入运算符重载getline获取一行字符串operator+只管少用,因为传值返回,导致深拷贝服从低relational operator大小比较https://i-blog.csdnimg.cn/direct/3fbb4704dbe6499c8b4a9e6f8aad925e.png
我们发现我们输入空格或者换行时,cin就会停止读取,那我们真的想要读取空格字符该怎么办呢?这是就该我们的getline出场了。
https://i-blog.csdnimg.cn/direct/ad1292e9565a4b98b466c0e58d74982a.png
getline函数有两个重载,第一个参数都是输入流,即cin,第二个参数是string范例,第三个参数就重要了,如果不传的话就是默认'\n'换行,你也可以指定结束字符。
https://i-blog.csdnimg.cn/direct/0f4b7c176d6147408c5b89095869064f.png https://i-blog.csdnimg.cn/direct/9c77db36dae347fd8fc210c6ca991009.png
https://i-blog.csdnimg.cn/direct/d60450a5f7d34fdc8ee1ec9ec31d81f3.gif
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]