用vector構造二維陣列
阿新 • • 發佈:2019-01-03
我們知道,C++的template引數是可以巢狀定義的,你可以這樣定義一個模板的Instance
vector <vector <int> >array2(3);//注意> 和> 之間的空格。
這就是我們的關鍵,array2可以儲存3個向量,向量的長度是可以改變的。array2[i]返回的是第i個向量。同理,array2[i][j]返回的是第i個向量中的第j個元素。
別急,還有一些細節問題:如下
vector <vector <int> >array2(3);
array2[1][2]=9;
我保證你的程式會segement failed,原因就是你沒有指定向量的大小。用push_back函式可以解決問題:array2[1].push_back(9);但是好象不太爽。就不能用operator[]嗎?答案是肯定的。不過要多加幾個步驟,如下:
for(int i=0;i <3;i++)
array2[i].resize(3);
這樣,你就定義了一個3X3的陣列了(另一個3在申明時定義的)。而且你可以隨時改變它的大小。
其他的,你還可以用C++的異常機制來捕獲如下標越界等非法行為。進行必要的處理。使你的程式更加的健壯。
下面提供一個範例,供參考。
//用vector來代替陣列 #include<iostream> #include<vector> using namespace std; void main() { vector<vector<int> >array(3);//二維陣列包含3個向量 for(int i = 0; i <3; i++) array[i].resize(3);//設定陣列的大小3X3 //現在你可以和使用陣列一樣使用這個vector for (int i = 0; i <3; i++) for (int j = 0; j <3; j++) array[i][j] = (i*j); //輸出 for (int i = 0; i <3; i++) { for (int j = 0; j <3; j++) cout<<array[i][j] << " "; cout<<endl; } cout << "------------" << endl; array.resize(5);//二維陣列包含5個向量 array[3].resize(3);//第4個向量包含3個元素 array[4].resize(3);//第5個向量包含3個元素 //現在是5X3的陣列了 for (int i = 0; i <5; i++) for (int j = 0; j <3; j++) array[i][j] = (i*j); for (int i = 0; i <5; i++) { for (int j = 0; j <3; j++) cout <<array[i][j] << " "; cout <<endl; } }
初始化二維陣列
vector<vector <int> > ivec(m ,vector<int>(n,0));
//m*n的二維vector,所有元素為0