前言
vector是一个动态的数组,我们最常使用push_back()向vector中添加元素。但是有时候我们希望在vector创建之后就按照下标来访问vector中的元素,如果直接v[i]是会报错的,因为此时vector的size是0,其中还没有元素。如何初始化vector到我们想要的大小呢。这就需要用到vector的resizeh函数了。
resize
首先看resize的函数原型
void resize (size_type n, value_type val = value_type());
resize()的作用是改变vector中元素的数目。
如果n比当前的vector元素数目要小,vector的容量要缩减到resize的第一个参数大小,既n。并移除那些超出n的元素同时销毁他们。如果n比当前vector元素数目要大,在vector的末尾扩展需要的元素数目,如果第二个参数val指定了,扩展的新元素初始化为val的副本,否则按类型默认初始化。
注意:如果n大于当前的vector的容量(是容量capacity,并非vector的size),将会引起自动内存分配。所以现有的pointer,references,iterators将会失效。
指定一维vector的大小
如果我们声明了一个vector:
vector v1;
此时我们不能使用v1[i]来访问它。
如果调用
v1.resize(5);
我们就把v1的大小设置成了5,就可以使用v[i]来访问它。
指定二维vector的大小
下面来看二维vector的情况。
在对二维vector如
vector< <vector> vec
如果我们使用vec.push_back()是没有问题的。
但是如果使用vec[i].push_back()会出现下标越界。
这是因为此时的vec为空,无论是vec还是vec[i]的size都是0,这个时候取vec[i]会出现下标越界情况。
解决办法是在push_back之前先定义vec的长度,如vec.resize(5);
此时我们就可以使用vec[i].push_back()了,但是vec[i][j]仍然会出现下标越界。
如果想使用vec[i][j],需要同时指定vec和vec[i]的大小,此时用到一个临时一维vector,代码如下:
vector <vector<int> > v1;
vector<int> temp(4)
v1.resize(5,temp)
此时的v1的size为5,v1[i] (0<i<5) 的size为4
resize和reserve的区别
首先必须弄清楚两个概念:
- capacity:指容器在分配新的存储空间之前能存储的元素总数。
- size:指当前容器所存储的元素个数
在弄清这两个概念以后,很容易懂resize和reserve的区别:
- reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。resize既分配了空间,也创建了对象。
- reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。
两者的形参个数不一样。
- resize带两个参数,一个表示容器大小,一个表示初始值(默认为0)
- reserve只带一个参数,表示容器预留的大小。
参考博客: