# 陣列 ## 一維陣列One-Dimensional Array :::warning 建議宣告在main函式外面 ::: - C++的陣列都要**先宣告好長度**,不可更改,不可變動 - **且長度不能為變數**,只能是常數(const 可以) - 由於都不能改變長度,所以要變動長度的陣列會用`vector` ( 後面章節會說明到 ) - **不能預設初始值** **宣告方式** ``` type name[size]; ``` 範例 ```cpp= int scores[5]; int scores[] = {90, 85, 78, 92, 88}; int scores[5] = {0}; // 這段程式碼並不是將每一格都變成 0,而是第一位初始化成 0 後再補上 0 char str[] = "hello"// string的陣列 char str[] = {'h' , 'e' , 'l' , '\0'}// \0表示字串結束 ``` ### 使用迴圈寫進list 並輸出 ```c= #include <iostream> using namespace std; int score[3]; //宣告在這 int main(){ for(int i=0;i<3;i++){ scanf("%d", &score[i]); } return 0; } ``` ## size() 會回傳記憶體空間 一個字元是 4 以下程式碼會輸出 28 = 7* 4 ```c= #include <iostream> #include <algorithm> // 後面章節會說到 using namespace std; int main(){ int M[] = {2,1,5,6,7,8,9}; cout << sizeof(M); return 0; } ``` ### 例題 --- 假設有個陣列起始位置A[0]記憶體位址為100(十進制表示),若每個元素需要兩單位的記憶體大小,則A[16] = ? --- :::warning 位址 = 起始位置 + ( index * 元素大小 ) ::: Ans = 132 ## 二維陣列 在處理座標資料、棋盤或表格時可以使用二維陣列。 :::success 直的稱行,橫的稱列。 ::: 處存時按照“列”優先 ```cpp type name[列i][欄j]; ``` - **i** : **rows** 二維陣列的列數。 - **j** : **columns** 二維陣列的欄數。 範例 ```cpp= int matrix[3][4]; // 宣告一個 3 列 4 欄的整數陣列 int matrix[3][4] = { // 初始化 {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; cout << "第一列第二欄的值為: " << matrix[0][1] << endl; // 輸出 2 ``` ### 遍歷雙重迴圈 ```cpp= #include <iostream> using namespace std; int main() { int matrix[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; for (int i = 0; i < 3; i++) { // 遍歷列 for (int j = 0; j < 3; j++) { // 遍歷欄 cout << matrix[i][j] << "\t"; } cout << endl; } return 0; } ``` ### 例題 --- 大部分程式語言都是以列為主的方式儲存陣列。在一個 8X4 的陣列 (array)A 裡,若每個元素需要兩單位的記憶體大小,且若 A[0][0]的記憶體位址為 108(十進制表示), 則 **A[1][2]的記憶體位址為何?** --- 記憶體位址計算公式 <font color="#f023"> > 位址=起始位址+(i⋅欄的數量+j)⋅每個元素的大小 </font> <p> 位址=108+(1⋅4+2)⋅2=120 </p> ## 三維陣列 ```c data_type array_name[層][列i][欄j]; ``` # Array c++ 11 才有的資料型態,提供更多方法可以快速地操作陣列 個人是不太常用 ```c= #include <iostream> #include <array> using namespace std; int main() { array<int,5> l = {1,2,3,4,5}; for (auto &i:l){ cout<< i<<endl; } return 0; } ``` - back(): 回傳最後一個 - empty(): 是否是空的 (會回傳0 or 1) - swap(): 交換兩陣列的值(陣列大小需相同) ```c= int main() { array<int,5> l = {1,2,3,4,5}; array<int,5> k = {0,9,8,7,6}; for (auto &i:l){ cout<< i; } l.swap(k); for (auto &i:l){ cout<< i; } // 會輸出09876 return 0; } ``` # 競程論 如果要跑"圖"的題目,像是迷宮等-**開陣列只是為了存地圖**-就可以用原生陣列,因為題目都會給範圍(範圍設在題目 $+2$),而且原生陣列執行起來會比較快。 有要複雜的陣列操作,在用到vector。