1.迭代器与反向迭代器(iterator-)
迭代器是可以用来访问string里面的内容的,这里来记录一下使用的方法。
里面用到了一个叫做begin函数和一个end函数,这两个都是针对string使用的函数。
s1.begin()函数是指向string内容的第一个元素
而s1.end()指向的则是最后一个元素的下一位
上面就是迭代器了,那什么是反向迭代器?
顾名思义,反向迭代器就是反方向来进行访问和迭代的方向与迭代器是相反的。
分别有rbegin()和rend()。
这里我们可以暂时理解成s1.begin()是指向这个s1的最后一个位置,而s1.rend()指向的是s1第一个的前一个位置,这边是有点奇怪的,因为s1.rend()所指向的位置是'\0',而'\0'一般又是一个字符串的结尾。我们虽然理解成上述所说,但他的遍历却是跟begin()和end()是一致的,何以见得?
首先我们在这里可以看到,如果直接输出s1.rend(),程序是会崩溃的,但却是可以输出s1.rend()-1,跟s1.end()是一样的。
其次还可以再看一段代码
这边的s1.rbegin()遍历也是跟上面的s1.begin()都是要++才能遍历。
而在这里我们如果给string来加上一个const的话,下面的s1.rbegin()是会报错的,这是因为string和const string是分开的,不能兼容的,如果你定义了一个const string的话,迭代器也应该相应的加上const
那么const迭代器和普通迭代器有什么区别吗。
由于const的性质影响,const迭代器他只具有只读的功能,而普通迭代器是具有可读可写的功能。
2.size,capacity
size是查看当前string的长度大小,而capacity是用来查看当前容量的大小
我们可以看到,s1有11个字符,所以他的size就是11个
那capacity又为什么是15呢?
容量的增容机制是什么呢?
我们可以看到,容量的初始化就是15,第一次的扩容是自身容量的2倍,然后每一次的增容都大约是1.5倍的自身容量。而capacity是包括每个string里面的\0的,因此他会多出来一个位置留给\0来进行存储。
3.reserve
reserve是用来给string开辟空间的,这里看到我欲意开辟100个空间,但是他却给了我111个,这是因为他在每次开辟空间的时候都会多开一点,通常是大于我们所想要开辟的空间的。
4.可以通过[]、at.()来对string进行访问
既然这两个的作用是相似的,那么他们会有什么区别呢?
当访问的数据越界时,用[]访问的话会引发一个叫做断言失败的报错。
而使用at.()的话,会出现一个编译错误
5.append(),+=
这个在python里面是往后面追加内容的意思。在这里的话,他也有好几种用法。
首先可以通过append来对string 进行尾插。跟push_back()的作用是一样的。
然后可以把一个string类型尾插到另一个string类型。
而当我们想要尾插的数据中有空格,我们又不想把空格弄进去,我们还可以这样做
这个比较麻烦一点,那我们不妨可以 使用+=来进行尾插
assign函数会对原有的内容进行覆盖。
6.insert、erase
insert函数可以在某个指定的位置之前插入指定的数据。
这里就是在指针指向0的时候,在0的前面插入数据。
erase函数可以指定删除的部分
这里的意思就是从第一个位置开始删,一共删掉三个数据。
7.replace,find
replace函数顾名思义,就是用来替换字符串中的数据
这里的意思就是,从s1中下标为1的字符开始,到1个字符的位置,换成"x"这个字符
这里的意思就是,从s1中下标为1的字符开始,到2个字符的位置,换成"x"这个字符,但这里的"x"由于只有一个,所以可以是看作把"x"右边的那块往x这里移动,并覆盖掉了一个"l"
而find函数是用来寻找相关的字符的。如果没有找到,就会返回一个string::npos
因此,结合上面的replace,我们可以写一个这样的代码。
简单解释一下,这里就是通过pos来记录s1中空格的位置,由于如果find没有找到空格的话会返回string::npos,因此,当pos!=string::npos,就说明找到了,那就直接使用replace来进行替换。