一、前言
本文我们就要来说一说STL中的string类,这也是我们在写C++代码的时候使用最多的
1、C语言中的字符串
首先要来谈的一点就是为什么要学习string类
string
意为字符串,那回忆一下我们在C语言阶段所学习的字符串,是以' '
结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,如果忘记了就再看看 字符串操作函数- 但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问
因此,在C++中专门搞出了一个与字符串相关的类,我们知道C++是面向对象的,我们可以在类内去写各种成员函数来对外提供操作字符串的接口,这个类就是string
类
2、string类的使用场景
那这个string有什么实际的应用场景呢,这可多了去了,如果经常刷题的同学应该瞬间能反应过来
- 从下面的两道OJ题就可以看出有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数
字符串转整形数字
字符串相加
二、初步认识string类
1、概述
string类的文档介绍
- 我们来到string类的文档中可以看到它确实是一个类,而且是由一个模版类
basic_string
所实例化出来的
- 如果你有学习过 C++模版 的话就可以知道这个类即为【类模版】
- 然后由这个类模版就实例化出了很多的模版类,其中就包含我们本文所要学习的string类
那有同学问,下面的这几个【wstring】、【u16string】、【u32string】是什么呢?
- 这一块的话要涉及到编码相关的知识,如果读者对这一块没什么接触的话就当了解一下
对于编码而言我们谈到最多的就是 ASCLL码 ,它的全称叫做【美国信息交换标准代码】,总共包含了像大小写的中英字母、数字、标点符号等等共128个,用来表示老美的的一些文章字符完全足够了。
而对于ASCLL码来说,是存在一个东西叫做映射表,即一个ASCLL码值就对应一个字符
我们可以到VS中来观察一下,其实在内存中所存放的都是ASCLL码,只不过呢在显示的时候却转换为了表中所对应的字符。这个63 64 65 66
其实是十六进制的写法,转换为十进制即为97 98 99 100
,那它们所对应的字符即为a b c d
如果有同学还是不相信的话可以看看下面这个,我给str[0]
这个位置放了数值为97,但是呢其为一个string类的对象,所以里面所存放的都是字符,可以看到在打印出来后的结果就是97所对应的ASCLL码值a
但是呢对于我们的一些中文汉字却是远远不够的,例如说下面这个”比特”
,我通过【sizeof】打印出了其在内存中所占字节数,发现有5B,这是为什么呢?原因就在于汉字的存储规则不是按照ASCLL码来的,而是专属于我国的一套编码字符集叫做GBK。在【GB2312-80】中就存储了很多有关汉字的规则
一般来说一个汉字对应的2个字节,这里的”比特”
是因为最后还有一个