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的值,容器内的对象并没有真实的内存空间(空间是"野"的)。
此时切记使用[]操作符访问容器内的对象,很可能出现数组越界的问题。