【c++】reserve与resize的区别
目录
1.reserve,直译过来是保留的意思,所以我把他理解成最少需要为当前的string保留这么多个空间。
2.为什么并不是我们想要预留的空间?
结论:
二、resize
1.resize,直译过来就是改变大小的意思,所以我的理解是改变了string中的size(有效字符的个数)。编辑
如果给定n比原来的字符串短,那么就截断。
如果给定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)。
穹笼: 为什么reserve还有改进版?哪个是源码的逻辑呢?
CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java
普通网友: 写的真好,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
普通网友: 引领技术潮流,是不可多得的好文,十分值得借鉴和参考。期待博主未来能够持续分享更多好文【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
一个平凡而乐于分享的小比特: 博主的文章是我每次学习的指南,总是解答了我遇到的问题。支持博主优质文章,讲解得非常详细,干货满满,通俗易懂,期待博主下次更新。感谢博主的付出,期待更多的精彩内容!