> 文档中心 > 二维vector,clear()操作请慎重,当心遇到vector subscript out of range问题

二维vector,clear()操作请慎重,当心遇到vector subscript out of range问题


问题

今天想要用vector实现二维数组的功能,尝试了把二维vector.谁知道刚上手就遇到了雷.

代码的形式大致如下:

vector<vector>vv(3);vv.clear();for (int i = 0; i < 3; i++)vv[i].push_back(0);

因为要重复使用该二维vector,所以进行了清空操作.然而却遇到了问题:vector subscript out of range

原因

后来在单步调试时发现了,clear()会让二维vector的size变成0,之前声明的3个一维数组的结构遭到破坏.(但可以看到它的capacity容量还是之前的值,这个后面会讲到).

执行到for的头部时,自动窗口如下:

如何解决

对上述代码做下改变:

vector<vector>vv(3);vv.clear();
vv.resize(3); for (int i = 0; i < 3; i++)     vv[i].push_back(0);

相当于把外层的vector的长度又恢复到了之前的值.

同样是执行到for的头部时,自动窗口如下:

 size和capacity的辨析:

vector的size和capacity的辨析:

《C++ primer》中说size指容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素个数(和内存大小相关)。可以大概拿乐高积木里的小人儿(size)和这些人住的院子(capacity)来做类比:

当放若干个小人儿时,我们同时也会搭容纳他们的院子.院子的容量>=小人儿的个数.

当vector进行clear操作时,就好像把小人儿从院子里都拿出去了,这时候size为0,而capacity院子的大小不会改变。

resize相当于把小人的个数size给定下来了,如果此时院子的容量能容纳这些小人儿的话,capacity不会改变.但倘若容量不够了,则capacity会增加.但vector中capacity并非按照size的量来设计的.它一般会变为原来空间的2倍.

可能不是特别妥帖,欢迎大家讨论.