---
# System prepended metadata

title: array and vector

---

# array and vector
作者: royyaha

---

## 一維
### 一維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}
    };
    ```

## 混搭風
一個維度是動態的，一個維度大小固定
``` cpp
vector<int> edge[5005]; // 宣告5005個 空vector

edge[5004].push_back(205);
```
