提起數組,大家想必都很熟悉,你可以用索引和指標來運算元組,給程式設計帶來了很大的靈活性。但是你知道它有許多天生的缺陷嗎?
首先,數組的越界可能會引起程式的崩潰(如果崩潰了,還算你走運^_^)。其次是動態性不好,包括動態改變大小,動態申請。諸如此類的事,一定會讓你傷透腦筋。有什麼辦法可以解決這些問題嗎?
你不用擔心,下面我來給大家介紹一種方法:用vector取代C-style的數組。
關於vector我不想多說,我假設大家都瞭解temlplate 和 STL。各位在任何一本C++的書上都可以找的到這些內容的(如果沒有,那趕快把它扔掉)。那為什麼是vector呢?我們知道vector提供了operator[]函數,可以像數組一樣的操作,而且還有邊界檢查,動態改變大小。(從這點上deque也是可以的)。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++的異常機制來捕獲如下標越界等非法行為。進行必要的處理。使你的程式更加的健壯。具體的方法我就不深入介紹了。留給各位自己鑽研。下面提供一個範例,供參考。
#include <iostream>
#include <vector>
using namespace std;
void main()
{
vector< vector<int> > array(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;
}
array.resize(5);
arry[3].resize(3);
arry[4].resize(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;
}
}