前言
在写题开二维数组时,总是直接开很大,这样很浪费内存,习惯不好,所以之后开始使用vector。
一、vector怎么开二维?
1.vector<int> v[n];
这样就开了一个具有n列,行数可变化的二维数组。但是这样行数还是不可变直接指定开好的还是会浪费空间,故而用第二种。
2.vector<vector<int>> v
这样就开了一个行数和列数都可变换的二维数组。
二、如何使用
1.第一种
第一种很简单只要直接在指定行插入元素就行了。例如:
vector<int> v[5];
v[0].push_back(2); //在一行尾部插入2;
v[0].push_back(3); //在第一行尾部插入3;
v[1].push_back(1); //在第二行尾部插入1;
2.第二种
第二种在刚开始使用时可能会遇到问题,再插入元素时会报错。例如:
vector<vector<int>> v;
有人直接
v.push_back(a); //a是你要插入的数
或者
v[0].push_back(a);
这样编译器会直接报错。
为什么呢?因为你创建的对象v里没有任何元素,里面目前是0行0列,而你用v[0].push_back(a);
直接在下标为0的一行的尾部插入元素a;可问题是目前v里根本没有这一行。
那这怎么办呢,我们要先插入一行空的vector<int>
例如:
创建一个vector<int>类型
vector<int> p;
然后插入
v.push_back(p);
现在v里就有了第一行。
再插入:
v.push_back(p);
v里就有了第二行,现在就可以跟第一种用法一样,在指定行尾部添加元素。
v[0].push_back(a>;
简便写法
v.push_back(vector<int>());
还可以这样写
当题目告诉你要开一个n行m列的数组时,我们写可以这样,在创建时直接指定行数和列数。
vector<vector<int>> v(n,vector<int>());
这样就直接建立了一个n行的动态数组。
或者直接列数也直接指定让他先开好。
vector<vector<int>> v(n,vector<int>(m));
这样就直接开好了一个n行m列的动态数组。
结论
vector<vector<int>> v;开一个动态数组,得先插入行,再插入单个元素。
vector<vector<int>> v(n,vector<int>());直接开一个n行的动态数组
相当于直接插入了n行,可直接在指定行插入元素。
vector<vector<int>> v(n, vector<int>(m));直接开一个n行m列的动态数组,
可直接指定位置修改元素,不用挨个push_back()插入,方便简洁。