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