# array and vector
---
* array
1. 宣告
```cpp
int arr[505]; // arr是陣列名稱,陣列儲存的資列形別是int
```
2. 初始化
```cpp
// 方法一
int arr[50];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
// 方法二
int arr1[50] = {0, 1, 2};
// 方法三
int arr2[50] {0, 1, 2};
// 全部初始為0
int arr3[50] {};
// ERROR!!
int arr3[50];
arr3 = {0, 1, 2};
```
> [!WARNING]
> ```cpp
> int arr[50]; //沒有初始化數值,arr[0]可能是奇怪的數字
> int arr1[50] = {1}; //arr[0] = 1, 剩下的數字初!始!為!0!
> ```
3. 遍歷array
`arr[0] = 1, arr[1] = 2, arr[2] = 3.....`
```cpp
int arr[50];
for(int i = 0; i < 50; i++) {
arr[i] = i + 1;
}
```
* vector
比較: 可以增加刪減空間
1. 宣告
```cpp
vector<int> v;
// v 稱作容器(想成裝資料),int是儲存內容的資料型別
// 此處空間是零
```
2. 基本涵式
```cpp
vector<int> v;
// v.empty() 看vector是不是空的
if(v.empty()) // 相當於v.size() == 0
cout << "I have a empty vector" << endl;
// v.size(); 看vector的大小
cout << "My vector have the size " << v.size() << endl;
// 在容器尾端,加入一個值(多開一個空間)
v.push_back(3);
```
4. 初始化
```cpp
vector<int> v(10);
// 有點類似 int v[10] = {};
// 容器v初始十個空間,並給初始值0
// v.size() 等於 10
//v1初始四個空間,值為5,等同於 vector<int> v1 = {5, 5, 5, 5};
vector<int> v1(4, 5);
vector<int> v2 = {0, 1, 2};
vector<int> v3 {0, 1, 2};
// v.size() 等於 3
vector<int> v4;
//初始v4從1 ~ 10
for(int i = 1; i <= 10; i++) {
v4.push_back(i);
}
```
5. vector取值
```cpp
vector<int> v = {1, 2, 3};
//輸出第一個值
cout << v[0] << endl;
cout << v.at(0) << endl;
// v[3] 應該不存在,但理論上還是會輸出值
cout << v[3] << endl;
// 和v[3]不同的是,他會跑出error訊息
cout << v.at(3) << endl;
```
6. 遍歷vector
```cpp
vector<int> v = {1, 2, 3, 4, 5, 6, 7};
for(int i = 0; i < 7; i++)
cout << v[i] << endl;
for(int i = 0; i < v.size(); i++) // v.size() = 7
cout << v[i] << endl;
```
* 二維陣列
1. 宣告
```cpp
int arr[2][3];
// 宣告兩個空間是三的陣列
```
2. 初始化
```cpp
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
// 也可以寫成這樣
int arr1[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
```
3. 遍歷
```cpp
int arr[2][3] {{1, 2, 3}, {4, 5, 6}};
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
// cout << i << " " << j << endl;
cout << arr[i][j] << " ";
}
cout << endl;
}
```
注意兩層迴圈的$i$, $j$
| $i$ | $j$ | |
| ------- | ------- | ------- |
| $i = 0$ | $j = 0$ |
| | $j = 1$ | 第一個陣列的第2個數值
| | $j = 2$ |
| $i = 1$ | $j = 0$ |
| | $j = 1$ |
| | $j = 2$ |
* 二維vector
1. 宣告
也就是宣告一個vector容器,裡面裝的東西都是一個vector<int>的容器
```cpp
vector<vector<int> > v;
```
2. 初始
```cpp
// 通常不會用到拉
vector<vector<int> > v = {{1, 2},{3, 4},{5,6}};
vector<vector<int> > v1 (2, vector<int>(3, 4));
// 比較 vector<int> v1(10, 5) 5為初始的值
// 這邊初始的值是 vector容器
v1.assign(2, vector<int>(3, 4));
vector<int> v2
// 上方程式碼相當於
for(int i = 0; i < 2; i++) {
vector<int> add(3, 4);
v2.push_back(add); // push_back一個容器酷吧
}
```
3. vector使用範例
```cpp
int t = 0;
vector<vector<int> > v;
for(int i = 0; i < 2; i++) {
vector<int> add;
for(int j = 0; j < 3; j++) {
add.push_back(t);
t++;
}
v.push_back(add);
}
```
以上相當於
```cpp
vector<vector<int> > v = {
{0, 1, 2},
{3, 4, 5}
};
```