---
# System prepended metadata

title: 4. 陣列

---

# 陣列

## 一維陣列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。