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

大家好,我是CodingLife99,感谢您阅读本文,欢迎一键三连。更多优质内容(毕设,大作业,资源分享等),请移步资源分区。

问题

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

代码的形式大致如下:

vector<vector<int>>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<int>>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倍.

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingLife99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值