【C++】vector动态二维数组

e79fd479648c4e55bdbf7f1b32a58f50.gif

        vector是模板,所以模板参数可以是任何类型,包括vector里面存string,vector里面存vector。

动态二维数组

vector<vector>其实就是一个动态二维数组。

1. vector<vector<int>>剖析

假设vector里的成员变量是_a,_size,_capacity,_a指向一个数组。

00e1821fcba94abc9d46ad553a4d0287.png

假如我们模板参数传int,就是vector<int>,那么_a就是int*类型的参数,数组里面存的就是int类型的数据。

bc584099f45c40998e75f9d002cfb90e.png

如果我们模板参数传vector<int>,就是vector<vector<int>>,那么_a就是vector<int>*类型的参数,数组里面存的就是vector类型的数据。

6dbab57e0cc94caa8dbd2d6d9c8d5468.png

数组里的vector里面也有_a,_size,_capacity。

239b86e44f904534981c3712c1a2601d.png

扫描二维码关注公众号,回复: 17516358 查看本文章

数组里面的_a是int*类型,指向int类型的数组。

35d40d068159414d81ff6a1cb464ac69.png

现在这里有个动态二维数组。

//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列。

16f3e0194f744514978959b2b6b61967.png
我们说了vector是模板,所以这个动态二维数组其实是实例化了两个类,一个是vector<int>,一个是vector<vector<int>>,编译器通过模板生成的类大概像下面两个这样。

eb863e336c384ff09c9ca4bf08dc1fa1.png

 

 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;
}

cbbd59aff99c4c86a668baa9a343684a.png

4. 相关练习-杨辉三角

118. 杨辉三角 - 力扣(LeetCode)

 这个题就是需要用到动态数组,静态数组完成不了。

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行开始。

5c0526c751264d438352c94e6c8cb2af.png

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就可以了。

本次分享就到这里,拜拜~

a96c6b34b52643faa5dd11a35ffc0694.gif

猜你喜欢

转载自blog.csdn.net/2402_82757055/article/details/143417222
今日推荐