1. 程式人生 > >用vector構造二維陣列

用vector構造二維陣列

我們知道,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