# 陣列
---
# 陣列是什麼
----
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":"陣列是可以儲存多個值的容器。"}