二维vector的使用
和数组一样,数组有二维的数组,vector也有二维的vector。下面就介绍一下二维vector的使用方法。
一般声明初始化二维vector有三种方法
(1) vector< vector<int> > v(n,vector<int>(m)); //在声明的时候就一次性指定vector内外层的大小;特别注意 > >之间是有空格的
上面语句构造了一个二维向量,它有n个元素,每个元素都是含有m个int型元素的一维向量;并且二维向量中每行的长度都是相等的(每行元素个数相同)
(2) 上面介绍的方法是一次性指定了二维vector的内外层大小的方法,并且每行大小都相同,那如果要求每行的长度不同怎么办呢? 可以用如下方法:
vector< vector<int> > v; //先声明一个二维向量
v.resize(n); //先根据需要指定外层大小
for(int i=0,len;i<n;i++) //在指定了外层大小后,接着再遍历指定内层每行的大小,此时每行的长度可以不同
{
cin>>len;
v[i].resize(len);
}
(3) 还可以用push_back()来添加每行,例如
vector< vector<int> > v; //先声明一个二维向量
for(int i=0,m;i<n;i++) / /添加n行,假设n已初始化
{
cin>>m;
push_back(vector<int>(m)); //往v里添加行,行的大小为m;vector<int>(m)也可以改成vector<int>(m,1),即用1来初始化每行
}
另外说一下,vector<int>(m,0);这个括号里面可以没参数,但是括号却不能省略
此时 v.pop_back() 是用来删除最后一行的,v.size()返回的是v的行数。
总的来说,二维向量的属性和一维向量是相同的,它们的用法也都一样,下面用代码展示了一下上面三种方法的具体用法:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main() 5 { 6 int n=0,m=0; 7 vector<vector<int> > v1(2,vector<int>(3)); 8 vector<vector<int> > v2,v3; 9 v2.resize(3); //指定v2有3行 10 cout<<"输入v2每行大小,共有三行:"; 11 for(int i=0;i<v2.size();i++) 12 { 13 cin>>m; 14 v2[i].resize(m); //指定v2每行的大小 15 } 16 cout<<"输入v3每行大小,共有四行:"; 17 for(int i=0;i<4;i++) //向v3里面添加四行 18 { 19 cin>>m; 20 v3.push_back(vector<int>(m)); //往v3里添加行,行的大小为m 21 } 22 cout<<"--------------------\n"; 23 24 cout<<"给v1赋值\n"; 25 for(int i=0;i<v1.size();i++) //给v1赋值 26 { 27 for(int j=0;j<v1[i].size();j++) 28 cin>>v1[i][j]; 29 } 30 cout<<"给v2赋值\n"; 31 for(int i=0;i<v2.size();i++) //给v2赋值 32 { 33 for(int j=0;j<v2[i].size();j++) 34 cin>>v2[i][j]; 35 } 36 cout<<"给v3赋值\n"; 37 for(int i=0;i<v3.size();i++) //给v3赋值 38 { 39 for(int j=0;j<v3[i].size();j++) 40 cin>>v3[i][j]; 41 } 42 cout<<"--------------------\n"; 43 44 cout<<"v1的大小:"<<v1.size()<<"\n"<<"v1中的元素:\n"; 45 for(int i=0;i<v1.size();i++) //打印v1 46 { 47 for(int j=0;j<v1[i].size();j++) 48 cout<<v1[i][j]<<" "; 49 cout<<"\n"; 50 } 51 cout<<"\nv2的大小:"<<v2.size()<<"\n"<<"v2中的元素:\n"; 52 for(int i=0;i<v2.size();i++) //打印v2 53 { 54 for(int j=0;j<v2[i].size();j++) 55 cout<<v2[i][j]<<" "; 56 cout<<"\n"; 57 } 58 cout<<"\nv3的大小:"<<v3.size()<<"\n"<<"v3中的元素:\n"; 59 for(int i=0;i<v3.size();i++) //打印v3 60 { 61 for(int j=0;j<v3[i].size();j++) 62 cout<<v3[i][j]<<" "; 63 cout<<"\n"; 64 } 65 66 v1.pop_back(); //用pop_back()删除最后一行 67 v2.pop_back(); 68 v3.pop_back(); 69 70 cout<<"-------删除最后一行后再打印---------\n"; 71 cout<<"v1的大小:"<<v1.size()<<"\n"<<"v1中的元素:\n"; 72 for(int i=0;i<v1.size();i++) //打印v1 73 { 74 for(int j=0;j<v1[i].size();j++) 75 cout<<v1[i][j]<<" "; 76 cout<<"\n"; 77 } 78 cout<<"\nv2的大小:"<<v2.size()<<"\n"<<"v2中的元素:\n"; 79 for(int i=0;i<v2.size();i++) //打印v2 80 { 81 for(int j=0;j<v2[i].size();j++) 82 cout<<v2[i][j]<<" "; 83 cout<<"\n"; 84 } 85 cout<<"\nv3的大小:"<<v3.size()<<"\n"<<"v3中的元素:\n"; 86 for(int i=0;i<v3.size();i++) //打印v3 87 { 88 for(int j=0;j<v3[i].size();j++) 89 cout<<v3[i][j]<<" "; 90 cout<<"\n"; 91 } 92 return 0; 93 }
结果如下:
还想再补充一下,不管是一维的还是二维的vector,凡是在指定好vector的大小以后,系统一般会自动将它初始化,默认初始化为0,下面验证一下:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main() 5 { 6 int n=0,m=0; 7 vector<vector<int> > v1(2,vector<int>(3)); 8 vector<vector<int> > v2,v3; 9 v2.resize(3); //指定v2有3行 10 cout<<"输入v2每行大小,共有三行:"; 11 for(int i=0;i<v2.size();i++) 12 { 13 cin>>m; 14 v2[i].resize(m); //指定v2每行的大小 15 } 16 cout<<"输入v3每行大小,共有四行:"; 17 for(int i=0;i<4;i++) //向v3里面添加四行 18 { 19 cin>>m; 20 v3.push_back(vector<int>(m)); //往v3里添加行,行的大小为m 21 } 22 cout<<"--------------------\n"; 23 24 cout<<"v1的大小:"<<v1.size()<<"\n"<<"v1中的元素:\n"; 25 for(int i=0;i<v1.size();i++) //打印v1 26 { 27 for(int j=0;j<v1[i].size();j++) 28 cout<<v1[i][j]<<" "; 29 cout<<"\n"; 30 } 31 cout<<"\nv2的大小:"<<v2.size()<<"\n"<<"v2中的元素:\n"; 32 for(int i=0;i<v2.size();i++) //打印v2 33 { 34 for(int j=0;j<v2[i].size();j++) 35 cout<<v2[i][j]<<" "; 36 cout<<"\n"; 37 } 38 cout<<"\nv3的大小:"<<v3.size()<<"\n"<<"v3中的元素:\n"; 39 for(int i=0;i<v3.size();i++) //打印v3 40 { 41 for(int j=0;j<v3[i].size();j++) 42 cout<<v3[i][j]<<" "; 43 cout<<"\n"; 44 } 45 return 0; 46 }
结果如下: