关于vector的resize的一个误区

vector的resize方法:void resize(size_type _Newsize, const value_type& _Val)       

有一个很容易犯错的点,今天让我耽误了两个小时的时间,特此记下:

resize并不会对原vector已经存在的元素进行重新初始化!!!!!

直接看代码:

代码中,在变量s,被resize为20后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值,只会将重新申请出来的栈空间内的值变为resize函数中输入的值(即代码中的rexy):

所以,resize不能用作重新初始化vector,那用什么方法比较好呢?其实可以直接定义一个初始化vector,如原vector的size相同,其值为初始化值。而vector之间的赋值,为深拷贝,这样就能够直接对vector的值进行初始化了,且效率很高(如代码)。

可见,执行完代码中的 s = reS, s的值变为(可以发现,其size竟然也变了,而capacity为20):

当注释掉resize代码, capacity变为了10

这个原因如下(此处转载于果岭里29文章)详见:https://blog.csdn.net/u013575812/article/details/51171135

size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。

capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。

当然,这两个属性分别对应两个方法:resize()和reserve()。

使用resize(),容器内的对象内存空间是真正存在的。

使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。

此时切记使用[]操作符访问容器内的对象,很可能出现数组越界的问题。
 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值