关于vector的resize的一个误区

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

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

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

直接看代码:

关于vector的resize的一个误区_第1张图片

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

关于vector的resize的一个误区_第2张图片

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

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

关于vector的resize的一个误区_第3张图片

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

关于vector的resize的一个误区_第4张图片

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

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

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

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

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

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

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

你可能感兴趣的:(关于vector的resize的一个误区)