用vector取代c-style的陣列
提起陣列,大家想必都很熟悉,你可以用索引和指標來運算元組,給程式設計帶來了很大的靈活性。但是你知道它有許多天生的缺陷嗎?
首先,陣列的越界可能會引起程式的崩潰(如果崩潰了,還算你走運^_^)。其次是動態性不好,包括動態改變大小,動態申請。諸如此類的事,一定會讓你傷透腦筋。有什麼辦法可以解決這些問題嗎?
你不用擔心,下面我來給大家介紹一種方法:用vector取代c-style的陣列。
關於vector我不想多說,我假設大家都了解temlplate 和 stl。各位在任何一本c++的書上都可以找的到這些內容的(如果沒有,那趕快把它扔掉)。那為什麼是vector呢?我們知道vector提供了operator函式,可以像陣列一樣的操作,而且還有邊界檢查,動態改變大小。(從這點上deque也是可以的)。vector本來就是可以用來代替一維陣列的,這裡只介紹用它來代替二維的陣列。二維以上的可以依此類推。
我們知道,c++的template引數是可以巢狀定義的,你可以這樣定義乙個模板的instance
vector
> array2(3);//注意》和》之間的空格。
這就是我們的關鍵,array2可以儲存3個向量,向量的長度是可以改變的。array2[i]返回的是第i個向量。同理,array2[i][j]返回的是第i個向量中的第j個元素。
問題到這裡,你可能會得意的說:"我明白了,很簡單嗎!"。別急,還有一些細節問題:如下
vector
> 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++的異常機制來捕獲如下標越界等非法行為。進行必要的處理。使你的程式更加的健壯。具體的方法我就不深入介紹了。留給各位自己鑽研。下面提供乙個範例,供參考。
#i nclude
#i nclude
using namespace std;
void main()
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++)
}
二維陣列 二維陣列和指標
include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...
陣列 二維陣列
一組相同型別的資料組合,是一種引用型別。陣列名稱不是固定的,與其存放的資料的型別有關。如 存放int型別的資料,陣列名稱 int 存放字串資料,陣列名稱 string 存放scanner型別的資料,陣列名稱 scanner陣列中的每個資料,都是這個陣列的元素。1 宣告 元素型別 變數名 元素型別 變...
陣列 二維陣列
陣列,從名字很簡單看出就是數字組合,一堆數 一堆元素 在一起。然後看一下怎麼定義,怎麼初始化。陣列的動態初始化 初始化之後每個元素的儲存內容為其對應資料型別的預設值。資料型別 陣列名 new 陣列型別 大小 int arr new int 5 資料型別 陣列名 new 陣列型別 大小 int arr...