1.reserve函数
(1)我们可以使用push_back这个函数插入字符,看看我们的这个编译器是如何进行扩容的;
我们可以发现,这个里面编译器一共是进行了4次扩容,第一次是以二倍的数量进行扩容,剩下的几次是以1.5倍的方式进行扩容的,这个是编译器决定的,例如在这个gcc编译器上面就是以2倍的方式进行扩容的;
(2)上面的我们是使用的push_back函数插入数据,看看这个编译器是如何进行扩容的,实际上我们也是可以调用这个reserve函数进行扩容的:
我们这个时候就可以发现,我们使用reverse函数进行扩容的时候,我们扩容的容量是100,但是编译器给我们开了111大小的空间,这个就是编译器自己决定的,我们是无法修改的;
reserve存在的价值,就是在我们知道大概需要多大的空间的时候,我们可以减少扩容,提前开好空间,提高效率;
(3)我们的这个reserve函数是不会缩空间的,就是当我们开的空间过大的时候,他不会释放掉多余的空间,实际上就算是缩的话,代价也是很大的,因为这个缩的话也是异地进行的,就是先拷贝一份,然后在这个拷贝的缩小空间,再把原来的空间给释放掉;
2.resize函数
(1)这个函数和reserve函数的作用基本一样,我们可以通过一些案例认识一下,这里我们原本的空间是一定的,我们进行resize函数调用的时候,传递的参数可能大于小于我们的大小,这个时候编译器就会根据情况做出不同的处理;
(2)我们在主函数里面调用这个函数,第一次打印的size就是字符串的大小,这里的size函数计算大小的时候是没有包含斜杠0的,capacity函数调用之后打印的结果是15,这个15就说明我们的字符串原本只需要12大小的空间就可以存下,但是编译器会给我们的字符串多开一部分的空间;
(3)下面的那个我们是调用的resize函数,传进去的参数是20,因为我们这个20是大于这个12的,这个时候就相当于是扩容了,我们自己想要的是20大小的空间,但是这个capacity函数调用的时候发现是31大小的空间,说明这个慷慨的编译器还是开出部分额外的空间,这个时候我们进行打印的时候好像没有实质的变化,实际上这个是已经发生了变化的,就是在这个字符串的后面添加上的都是斜杠0,我们的控制台没有打印出来而已;
(4)如果我们想要看到这个变化,我们可以添加第二个参数,相当于是对于这个新开的空间进行我们想要的初始化;
(5)实际上这个resize函数在string里面不会经常使用,但是为了保持这个接口的完整性,我妈呢还是需要了解它的用途的;
3.at函数
(1)这个函数的作用就是像下面的表述那样,就是相当于是一个索引的作用,他就是一个普通的函数,作用是和这个[]的作用是一样的,所以我们经常使用这个[ ] ,而不是这个at函数;
(2)这个函数的索引使用的是圆括号,而不是中括号,我们通过这个案例也可以发现他和[ ] 是没有区别的,第一个字符h经过这个[ ] 索引的加加变为i字符,经过这个at函数的加加变成了打印出来的j字符;
4.一些运算符的重载说明
(1)我们可以调用库里面的函数在这个尾部插入字符,例如我们可以调用这个append函数,push_back函数插入字符;
(2)我们同时可以使用这个+=运算符的重载实现这个功能,在test3函数里面,我们使用+=运算符将这个#和hello字符串追加到world这个已知字符串的后面;
(3)我们也可以向下面的一样的功能,但是这个加号不会改变这个原来的字符串,所以我们需要借用一个变量进行存储执行+运算之后的结果,我们发现是可以实现+=的功能的,但是这个我么不会经常使用,这个会涉及到拷贝构造函数;
5.assign函数
(1)下面我们定义了一个字符串str和base,我们调用这个assign函数相当于是使用base覆盖掉原来的str字符串,我们也可以从str的某个位置开始覆盖,在下面我们是多写了2个参数,第二个参数代表的就是从那个位置开始,第三个参数就是从开始位置开始的多少个字符被我们选择;
6.insert和erase函数
(1)我们之前介绍的push_back函数是在这个尾部插入数据,但是这个里面的insert就是从这个任意的位置插入数据,我们下面的案例就是从第0下标位置开始插入3个x字符,这个函数里面的第二个参数表示的就是插入字符的个数,就算我们只需要插入一个字符,我们也要标明是1,这个第二个参数的1是不可以省略掉的;
(2)erase函数就是删除数据的函数,这个函数里面的参数表示就是从第几个位置开始删除后面的所有的数据,这个里面我们传的参数是6,这个时候就会从这个字符串的第六个位置开始后面的数据全部删除;
(3)这两个函数我们也不会经常使用的,因为这个删除数据或者是插入数据都会造成后续数据的移动,这样的话效率就会比较低;
7.replace函数
(1)这个函数的作用就是替换掉里面的某个字符,或者是某些字符,具体的使用方法如下:
这里的含义就是在这个下标是3的位置,把从这个位置开始的一个字符替换为d这个字符,对就算是替换里面的一个字符,我们也是要写出这个第二个参数的,对于替换很多个字符,这个参数就更不能省略掉了;
(2)一个简单题目:把和这句话里面的所有的空格替换为%20,这里可能有些同学就会使用这个函数,但是实际上这个函数不会经常使用,我们是使用的循环判断语句解决这个问题,重新定义了一个字符串str3用来存储这个数据;符合条件就会直接添加,否则就直接使用20%代替掉;
8.swap函数
(1)上面的那个替换,我们是使用的str3接受的,如果我们替换之后就想要的是str2,我们就必须了解这个swap函数,这个函数有3个,一个是全局的库里面的函数,一个是string里面的成员函数,一个就是string里面的非成员函数;
(2)有一个参数的是成员函数,两个参数的是非成员函数,模版的那个就是库里面提供的函数,我们使用swap(str2,str3)就会执行非成员函数,我们使用str2.swap(str3)就会执行成员函数,那个模版的库函数不会被使用到,这个也是当时设计的时候就考虑到的问题,因为模版需要执行三次深拷贝,效率是很糟糕的。