vector是模板,所以模板参数可以是任何类型,包括vector里面存string,vector里面存vector。
动态二维数组
vector<vector>其实就是一个动态二维数组。
1. vector<vector<int>>剖析
假设vector里的成员变量是_a,_size,_capacity,_a指向一个数组。
假如我们模板参数传int,就是vector<int>,那么_a就是int*类型的参数,数组里面存的就是int类型的数据。
如果我们模板参数传vector<int>,就是vector<vector<int>>,那么_a就是vector<int>*类型的参数,数组里面存的就是vector类型的数据。
数组里的vector里面也有_a,_size,_capacity。

数组里面的_a是int*类型,指向int类型的数组。
现在这里有个动态二维数组。
//10*5的二维数组
vector<int> v(5, 1);
vector<vector<int>> vv(10, v);
首先就是vector<vector<int>> vv(10, v);用10个v初始化,10就是10行;v又是用5个1初始化的,5就是5列。
我们说了vector是模板,所以这个动态二维数组其实是实例化了两个类,一个是vector<int>,一个是vector<vector<int>>,编译器通过模板生成的类大概像下面两个这样。
2. 动态二维数组的访问
想访问这个二维数组的话,直接方括号[]访问就行。
//10*5的二维数组
vector<int> v(5, 1);
vector<vector<int>> vv(10, v);
vv[2][1] = 2;//访问第2行第二列,改变它的值
两个[]调用的不是同一个类,是两个不同的类,模板通过不同参数实现的那两个不同的类。
3. 动态二维数组的遍历
动态二维数组遍历用到的是下标遍历,此时迭代器、范围for都不好使。
for (size_t i = 0; i < vv.size(); i++)
{
for (size_t j = 0; j < v.size(); j++)
{
cout << vv[i][j] << " ";
}
cout << endl;
}
4. 相关练习-杨辉三角
这个题就是需要用到动态数组,静态数组完成不了。
numRows是行数,我们先开行的空间。
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv(numRows); //行
}
};
通过观察我们也可以发现,列数等于行数+1,比如第0行有1列,第1行有2列。用resize开空间,不用reserve,因为我们不仅要改变capacity的大小,还要size也变化。
vector<vector<int>> generate(int numRows)
{
vector<vector<int>> vv(numRows); //行
for (size_t i = 0; i < vv.size(); i++)
{
vv[i].resize(i + 1, 1);//列,全初始化为1
}
}
接下来就是改变三角形里面的值。从2行开始。
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv(numRows); //行
for (size_t i = 0; i < vv.size(); i++)
{
vv[i].resize(i + 1, 1);//列
}
for (size_t i = 2; i < vv.size(); i++)
{
for (size_t j = 0; j < vv[i].size()-2; j++)
{
vv[i][j+1] = vv[i-1][j] + vv[i-1][j+1];
}
}
return vv;
}
};
最后返回vv就可以了。
本次分享就到这里,拜拜~