大家好,我是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倍.
可能不是特别妥帖,欢迎大家讨论.