使用 array


如果需要線性、長度不變的資料容器,可以使用 array,這需要包含 array 標頭檔:

#include <array>

技術上來說,array 是個類別模版(class template),不過使用上,只需要知道,array 可以裝載指定型態的資料。例如,建立長度為 5,可裝載 intarray<int, 5>

array<int, 5> number;

如同原生陣列,number 每個索引位址的初值是不可預期的,若想在建立容器時裝載指定的元素,可以使用清單初始化(list initialization)或者初始器(Initializer):

array<int, 3> id = {0};    // 全部初始為 0
array<int, 3> number = {10, 20, 30};
array<double, 3> score{85.5, 78.2, 63.0};

想要循序地走訪 array 中的元素,可以使用 for range 語法,例如:

#include <iostream>
#include <array>
using namespace std;

int main() {
    array<int, 3> number = {10, 20, 30};

    for(auto n : number) {
        cout << n << endl;
    }

    return 0;
}

透過 [] 指定索引可以存取特定位置的元素,例如:

#include <iostream>
#include <array>
using namespace std;

int main() {
    array<int, 3> number = {10, 20, 30};

    for(int i = 0; i < number.size(); i++) {
        cout << number[i] << endl;
    }

    return 0;
}

可以從 arraysize 方法得知元素的個數,empty 方法可以得知是否為空,front 方法可以取得第一個元素,back 方法可以取得最後一個元素,fill 方法可以將各元素內容設為指定值。

array 可以使用另一個 array 作為引數來建構,例如以 a1 作為引數來建構 a2

array<int, 3> a1 = {10, 20, 30};
array<int, 3> a2(a1);

這會將 a1 的元素複製給被指定的 a2array 可以指定給另一 array,這也會將 array 的元素複製給被指定的 array,例如:

array<int, 3> a1 = {10, 20, 30};
array<int, 3> a2 = a1;

若要指定來源 vector 的某個範圍建構出新的 vector,必須指定起始位置的 iterator 與結束位置的iterator,例如底下從索引 2 開始走訪至尾端的元素,用以建立新的 vector

vector<int> v1 = {10, 20, 30, 40, 50};
vector<int> v2(v1.begin() + 2, v1.end()); // 包含 30, 40, 50

array 具有 beginend 方法,分別傳回起始位置的 array<int, LENGTH>::iterator 與結束位置的 array<int, LENGTH>::iterator,可以把它們看成代表首個元素與最後一個元素的位置,對它們進行 +- 運算,表示元素的位移量,操作上很像指標,至於是不是真的指標,要看底層的實作而定。

就 API 的設計來說,不建議將 beginend 方法的傳回值看成是指標,而建議將之看成迭代器(iterator),這些迭代器重載了相關的運算子,令其看來像是指標操作,因為容器相關的程式庫,為基於這類操作協定,令提供的 API 具有通用性。

若要使用迭代器來走訪元素,例如,先前的 for range 語法,若要使用 beginend 方法,可以搭配 for 迴圈,例如:

#include <iostream>
#include <array>
using namespace std;

int main() {
    array<int, 3> number = {10, 20, 30};

    for(array<int, 5>::iterator it = number.begin();
        it != number.end();
        it++) {
        auto n = *it;
        cout << n << endl;
    }

    return 0;
}

如果打算對 array 進行排序、尋找、反轉等操作,可以使用包含 algorithm 標頭檔:

#include <algorithm>

一些操作會使用到迭代器,例如下面這個程式直接示範了排序、尋找、反轉等操作:

#include <algorithm>
#include <iostream> 
#include <array>
using namespace std; 

int main() { 
    array<int, 6> number = {30, 12, 55, 31, 98, 11};

    // 排序 
    sort(number.begin(), number.end());
    for(auto n : number) {
        cout << n << " ";
    }
    cout << endl;

    cout << "輸入搜尋值:";
    int search = 0;
    cin >> search;

    array<int, 6>::iterator it = find(number.begin(), number.end(), search);
    cout << (it != number.end() ? "找到" : "沒有")
         << "搜尋值" 
         << endl;

    // 反轉 
    reverse(number.begin(), number.end());
    for(auto n : number) {
        cout << n << " ";
    }
    cout << endl;

    return 0; 
}

執行結果:

11 12 30 31 55 98
輸入搜尋值:12
找到搜尋值
98 55 31 30 12 11