# 陣列 --- # 陣列是什麼 ---- C++中,陣列是由一串連續的記憶體所組成, 可以儲存多個數值。 一個陣列內的資料類型都是一樣的。 ---- 如果有一個陣列大小為n。 那麼索引值就會是從 0 到 n-1 , 可以存取 第1個 到 第n個 元素。 (索引0對應第1個,以此類推) --- # 傳統陣列 ---- 叫做傳統陣列是因為它是從C流傳下來的, 功能比較簡單。 ---- ## 宣告 在一般宣告變數後面加上一個[ ],就會 讓那個變數宣告為傳統陣列。 而在[ ]中放入正整數,就可以決定陣列的大小。 傳統陣列的大小在宣告的時候就已經固定了, 不能改變。 ---- 範例: ```cpp //type name[size]; int a[10]; //這樣就會創建一個可以儲存十個整數的陣列。 ``` ---- ## 初始化 在宣告時後面加上等號,然後接上大括號, 裡面包著內容的值就好了。 如果大括號裡面的值沒有陣列大小那麼多的話, 就會補上預設值。 ---- 範例: ```cpp int arr[5] = {10, 5, 4}; // 這個陣列裡面的前三項會變成10, 5, 4。 // 陣列內容:{10, 5, 4, 0, 0} bool arr2[3] = {}; // 如果什麼都沒有就是全為預設值。 // 陣列內容:{0, 0, 0} (0就是false) ``` 注意,如果沒有初始化,裡面會是亂數, 而不是預設值。 ---- ## 存取陣列 要存取陣列,要在陣列名稱後接上[x], x就是要存取的索引值,就可以得到第x+1個元素。 ---- ## 改變陣列內容 一樣在陣列名稱後接上[x], 接著後面指派要儲存的值。 ---- 範例: ```cpp //陣列內容:{10, 5, 4, 0, 0} cout << arr[3]; // 輸出陣列的第4個元素。 //輸出:0 p = arr[1]; // 把p設為陣列的第2個元素。 //p=5 arr[1] = 7; // 把陣列的第2項改成7。 //陣列內容:{10, 7, 4, 0, 0} arr[4] -= 3; // 把陣列的第5項減少3。 //陣列內容:{10, 7, 4, 0, -3} cin >> arr[3]; // 輸入存至陣列的第4項。 ``` --- # 全域陣列 全域就是指在最外面的一層 ---- 有時候宣告陣列時有一個問題,記憶體不足。 這是因為main中分配到的記憶體沒有很多。 但如果在main外面宣告就可以了。 ---- 不同編譯器、不同設定的記憶體分配都可能不同。 使得main中的最大陣列大小不同 在全域中,陣列的限制也可能因為編譯器而不同。 ---- 範例: ```cpp= int arr[100003]; // 將陣列開的比最大要求還大一點。 int main(){ // 後面再接main //一些程式 return 0; } ``` --- # 動態宣告 ---- 動態宣告其實語法上是錯的,但有些編譯環境都會讓它通過。 不過還是盡量不要這樣做。 ---- 動態宣告是指在宣告的時候,[ ]內的值不是常數,而是變數。 這會導致在編譯時,電腦無法決定陣列大小而 指派亂數大小,也可能導致記憶體溢出。 ```cpp int n; cin>>n; int arr[n]; // 這樣就屬於動態宣告 ``` ---- 因此,可以用大小確定超過最大值的全域陣列來代替。 ```cpp= // 假設確定最大不超過20000 int arr[20003]; // 依照需求,將陣列開的比最大還大一點。 int main(){ // 後面再接main //一些程式 return 0; } ``` --- # 二維陣列 ---- 二維陣列是指在陣列宣告後再接上一個[],相當於以陣列為內容組成陣列。 沒有在初始化範圍的都會是裝著預設值的陣列。 ```cpp int matrix[3][3]={{1, 2, 3}, {4, 5, 6}}; // 宣告2*3的二維陣列 cout << matrix[0][1]; // 輸出2 matrix[1][2]=10; //陣列內容:{{1, 2, 3}, {4, 5, 10}} ``` ---- ## 多維陣列 多維陣列就是在陣列後繼續加上[ ]。 二維陣列也是多維陣列的一種。 通常不會到四維。 --- # 迴圈與陣列 ---- ## 遍歷陣列 用for迴圈,可以從0到(陣列大小-1)都跑一遍, 就可以存取每一個了。 ```cpp // 依索引大小一一輸出 for(int i=0; i<n; i++){ // i 從0到n-1 都跑一次 cout << arr[i] << ' '; // 輸出每個索引i的儲存值 } ``` ---- ## 輸入、改變陣列 一樣用for迴圈,可以從0到(陣列大小-1)都跑一遍。 ```cpp // 依序從索引小到大輸入 for(int i=0; i<n; i++){ // i 從0到n-1 都跑一次 cin >> arr[i]; // 輸入存到索引i。 } ``` ---- ## range-for迴圈 for迴圈除了之前講的用法外,還有另一種用法。 ```cpp // 自動依索引從小到大輸出 for(int num : arr){ // 每個arr中的元素都會出現一次 cout << num << ' '; // 輸出每個num } ``` 注意:num並不代表arr[i], 改變num不會改到陣列本身。 --- 自行練習: [ZeroJudge d074](https://zerojudge.tw/ShowProblem?problemid=d074) [ZeroJudge a248](https://zerojudge.tw/ShowProblem?problemid=a248) [ZeroJudge a015](https://zerojudge.tw/ShowProblem?problemid=a015)
{"contributors":"[{\"id\":\"00ad9127-6491-4b3d-829b-7847a217f8e5\",\"add\":3493,\"del\":879}]","title":"陣列","description":"陣列是可以儲存多個值的容器。"}
    175 views