目录
1.reserve,直译过来是保留的意思,所以我把他理解成最少需要为当前的string保留这么多个空间。
1.resize,直译过来就是改变大小的意思,所以我的理解是改变了string中的size(有效字符的个数)。编辑
如果给定n比原来的字符串长,并且没有给第二个参数c,那就用'\0'填补剩下的空间。
如果给定n比原来的字符串长,且给了第二个参数c,那就用此参数进行初始化追加的空间。(若给的size比当前capacity大,那也会改变capacity,这时是同reserve相同的规则)
最近整理笔记时,发现c++中的string类有两个成员函数reserve与resize的英文名翻译出来很像,于是特地查了一下cplusplus,现总结如下:
一、reserve
1.reserve,直译过来是保留的意思,所以我把他理解成最少需要为当前的string保留这么多个空间。
代码如下:
在s1中我想保留20个字节的空间,编译器为我预留了31(32,还有一个'\0')字节的空间,而不是整20字节。
在s2中我想保留10个字节的空间,编译器为我预留了15(16,同上)字节的空间,而不是我想要的10字节。
2.为什么并不是我们想要预留的空间?
我创建了一个空字符串s3,可见默认给的capacity(有效字符容量)就是15,说明vs在写string类时,给了缺省值15。
我接下来看了编译器怎么实现扩容操作的:
代码如下:
由此可知,编译器在字符串剩下的空间不够用时一般进行的是1.5倍扩容。
结论:
综上,可以知道这个reserve函数进行的操作是:我为你预留空间,大于或者等于你给的这个数。
二、resize
1.resize,直译过来就是改变大小的意思,所以我的理解是改变了string中的size(有效字符的个数)。
代码如下:
如果给定n比原来的字符串短,那么就截断。
如果给定n比原来的字符串长,并且没有给第二个参数c,那就用'\0'填补剩下的空间。
如果给定n比原来的字符串长,且给了第二个参数c,那就用此参数进行初始化追加的空间。(若给的size比当前capacity大,那也会改变capacity,这时是同reserve相同的规则)
结论:
综上,可以得出resize的作用是改变字符串的size,如果给定的n比size小,那就截断;
如果大,那就加长size(也可能改变capacity)。