文章目录
- 一string类
- 1C语言中的字符串
- 2C++中的string
- 二遍历
- 1[ ]
- 2迭代器
- 3const迭代器
- 4范围for
- 5auto
- 6总结
- 三String的尾插
- 1size和length
- 2max_size,capacity和clear
- 3访问接口
- 4尾插字符和字符串
- 5 append的重载
- 三string的扩容问题
- (1)怎么扩容
- (2)reserve和reverse
一string类
1C语言中的字符串
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列
的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户
自己管理,稍不留神可能还会越界访问。
姓名。地址,
2C++中的string
在使用string类时,必须包含#include头文件以及using namespace std;
auto和范围for
我们马上在下文会提到这两个特别好用的用法,希望大家注意
string类本身是basic_string typedef的过来的
basic_string本身是一个模板
注意事项
(1)c++中的string类是包含在string头文件里的,所以要包含string
(2)容器和类里面一般会有接口,包括一些写好的函数和特殊定义(比如size,capacity)都叫接口
(3)c++一开始设计的时候没有容器的概念,string与后面的容器有一些不一样。具体表现是string的 接口非常多而杂,有些甚至重复定义,这是为了与后面的迭代器保持一致,但是以前多的不能删,后面c++的内容也只能兼容string.
二遍历
1[ ]
这里[ ]属于element access(元素获取)个人认为有点像访问的关键字
这里设置的非常巧妙,本来string类不能像数组一样访问下标直接访问或者遍历全部元素的,但是我们可以认为规定位置,然后返回进行访问,这样起到了数组下标访问问的效果
这样我们就可以进行遍历
2迭代器
迭代器差不多类似于指针,但是底层不同,string的迭代器类似于指针,下面it1类似于指针,cout*it1类似于解引用。
但其他的容器不一定。
迭代器差不多类似于指针,但是底层不同,string的迭代器类似于指针,但其他的容器不一定。
反向迭代器,从end往begin输出
3const迭代器
const对象不能使用普通迭代器
看上面的const对象如果像进行定义就要进行const修饰迭代器,这也是权限的放大 。
4范围for
我们以前遍历一些东西都要用(for int i=xx;i<xxx;i++)但是我们学了范围for可以方便的定义遍历
for(xx a:xxx)
是吧xxx从头到位赋值给a,然后一个个输出,编译器自动识别开头和结尾 、
xx是定义的类型
5auto
四种迭代器iterate,const iterate,reverse_ iterate,const reverse_ iterate
然后可以定义后直接 auto xxx=xxx.begin();这样不用指明很长的类型
然后上面的for遍历for(xx a:xxx)
xx可以写成auto,自动识别xxx的类型给auto
但是不会推出引用,要自己写一个&
现在auto引用时定义迭代器可以短一点
修改的时候要加&,因为是把s1一个个赋值给ch然后输出。下次cout时候就没用了,
但是一开始赋值给别名就进行前置修改了。
6总结
三种遍历方法,[],迭代器,范围for
范围for底层是迭代器,所以只有容器中支持迭代器的才支持范围for
因为数组底层和迭代器差不多,所以也支持范围for
auto是一个自动识别的类型,在定义迭代器类型一般是很多的字母,可以用auto
三String的尾插
1size和length
推荐size 因为其他容器也兼容size,这就二中注意事项中string臃肿的部分
2max_size,capacity和clear
这三个都是接口,max_size是最大下标,
capacity和栈中一样是空间可以扩容,
clear是把size直接搞成0。
3访问接口
at,[]
我们在遍历中知道[ ]怎么访问的了
下面我们介绍at
at和[]的不同是如果访问到非法处理方式不一样,at要抛出异常,然后捕获what(),如图:
[]异常是:
4尾插字符和字符串
尾插字符是push_back
尾插字符串是append
5 append的重载
我们不仅可以用接口,接口其实也有许多重载,这里我们就不细说了
三string的扩容问题
(1)怎么扩容
根据编译器的不同扩容方式不一样,这里是vs2022,它在后面一般是1.5倍的扩容。
(2)reserve和reverse
reverse是一个扩容接口(函数),反正我们如果提前知道要扩容多大可以直接提前reverse,他会提前开好一个比较大的空间,这样就不要频繁的扩容,在堆上开空间,
reverse有反转的意思,一般命名时候用到,上文的反向迭代器就加了reverse的前缀。