指定C++ vector、二维vector的大小及resize与reserve的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/88692708

前言

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的区别

首先必须弄清楚两个概念:

  1. capacity:指容器在分配新的存储空间之前能存储的元素总数。
  2. size:指当前容器所存储的元素个数

在弄清这两个概念以后,很容易懂resize和reserve的区别:

  1. reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。resize既分配了空间,也创建了对象。
  2. reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。

两者的形参个数不一样。

  1. resize带两个参数,一个表示容器大小,一个表示初始值(默认为0)
  2. reserve只带一个参数,表示容器预留的大小。

参考博客:

  1. c++ vector resize & reserve
  2. 关于vector的resize()的理解
  3. c++学习笔记-指定二维vector大小

猜你喜欢

转载自blog.csdn.net/liuweiyuxiang/article/details/88692708
今日推荐