【C++第十章】学习String
STL介绍🧐
学习string之前,我们要先了解一下STL库,STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,也是一个包罗数据结构与算法的软件框架。STL有四个版本——原始版本、P.J.版本、RW版本、SGI版本,本文所学习的是SGI版本的STL。
STL六大组件,分别为仿函数、算法、迭代器、空间配置器、容器、配接器,我们所学的string便是容器中的一种(不过严格来说string出现时间早于STL库,属于C++标准库)。
认识String🧐
string也是属于模板的一种,只不过被重命名了,那为什么要写成模板呢?这要从早期的编码说起。
由于早期的ASCII码不能很好解决各国语言存在的差异化,随后出现了Unicode(万国码)用于解决传统字符编码的局限性,并且万国码兼容ASCII码,以0开头的就是ASCII码,而常见的汉字基本为两个字节。Unicode是字符集,而Unicode中的UTF-8、UTF-16、UTF-32才是字符编码规则,我们用UTF-8就足够了,而其他语言可能要用UTF-16、UTF-32才能存下该字符。
我们测试发现,前两个字节组成“你”,后两个字节组成“好”,在Windows下一般使用GBK编码,兼容更多的汉字,Linux下用UTF-8。
并且,在早期还出现过wchar_t宽字节去存储字符,后面为了规范还出了char16和char32去兼容UTF-16和UTF-32,它们所占用字节也不同。而我们发现输入一些生僻字时打印出来会变成乱码,这是因为计算机找不到对应的编码规则,比如编译器中仅存了ASCII的编码规则,我们输入中文进去自然无法识别。
所以string写成模板是为了去兼容各种字符类型,不管是传char16和char32都可以接收。
基本使用🧐
在C语言中,我们创建字符串没办法按需申请和释放,但在C++中string支持各种运算符重载,如下代码,字符串能够自动扩容,自动追加,为我们节省了不少时间。