基础认识:
- string严格意义上不属于STL容器,其出现的时间早于STL,这也导致了string官方库中部分函数冗余。但是这也体现了语言发展中的一个重要现象——向前兼容。
- 和很多STL容器一样,string是一个类,核心是一个顺序表,同时提供一系列接口,以及方法,从而简化在编程中对字符串的相关操作。
- 和其他容器不同的是,库中string类使用模板的意义不在于,能使不同内置类型得到相应的实例化,而是针对不同文字的编码,常见的有:uicode(万国码)、UTF-8、UTF-16、UTF-32(数字越大能表示的字符数量就越多)、gbk。
- string类中的reserve当n小于capacity时不一定会缩容,如VS上不会,但linux上会。
- 谨慎使用insert头插、中间插,replace(如果是平替还好),erase中间删且量小,因为会扩容和移动数据,效率低下。
三种重要的遍历方式
方括号遍历:
比较常见的一种遍历,因为string支持方括号的重载
迭代器遍历:
因为string特殊的物理结构,可以简单地认为,迭代器就是指针。而实际上迭代器是一种封装的思想,使用者不用花太多心思在如何根据需要访问数据上,只需要延续使用指针的传统,从而达到了简化的作用。begin()、end()一组左闭右开的区间,end()指向的是最后一个字符的下一个位置。
范围for遍历(特殊):
范围for遍历的底层其实还是迭代器,在模拟实现中,实现好迭代器后,范围for的写法立即生效。同时注意不用对ch++或者解引用。
模拟实现
不考虑编码、模板,旨在体会string构造的模拟练习:
实现中的要点回顾
- 在做全缺省传参的时候,缺省值不要给nullptr,应该给'\0',并且斜杠零不应该计入capacity与size中。
- strcpy会把'\0'也拷到目标中,先拷贝判断。
- reserve开空间要多开一个留给斜杆零
- 拷贝、修改字符串的时候一定注意有没有考虑到斜杠零