from: xheartblue.home.chinaren.com
用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的陣列了。而且你可以隨時改變它的大小。
其他的,你還可以用c++的異常機制來捕獲如下標越界等非法行為。進行必要的處理。使你的程式更加的健壯。具體的方法我就不深入介紹了。留給各位自己鑽研。下面提供乙個範例,供參考。
#include
#include
#include
#include
#include
#include
using
namespace
std;
int main()
array.resize(5);
array[3].resize(3);
array[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++)
return
0;}
使用Vector實現二維陣列
from xheartblue.home.chinaren.com 用vector取代c style的陣列 提起陣列,大家想必都很熟悉,你可以用索引和指標來運算元組,給程式設計帶來了很大的靈活性。但是你知道它有許多天生的缺陷嗎?首先,陣列的越界可能會引起程式的崩潰 如果崩潰了,還算你走運 其次是動態...
vector實現二維陣列
用vector實現二維陣列的好處 1 陣列的越界可能會引起程式的崩潰,動態性不好,包括動態改變大小,動態申請。2 vector提供了operator函式,可以像陣列一樣的操作,而且還有邊界檢查,動態改變大小。簡單說下c 構建動態的二維陣列 int p p new int 10 注意,int 10 表...
vector 二維陣列
1052 賣個萌 20分 萌萌噠表情符號通常由 手 眼 口 三個主要部分組成。簡單起見,我們假設乙個表情符號是按下列格式輸出的 左手 左眼 口 右眼 右手 現給出可選用的符號集合,請你按使用者的要求輸出表情。輸入首先在前三行順序對應給出手 眼 口的可選符號集。每個符號括在一對方括號內。題目保證每個集...