語法書 / AA 競程語法書 下冊 / 第十單元 / array:披上容器外衣的陣列(延伸知識)

10.12 array:披上容器外衣的陣列(延伸知識)

想把「固定幾個一組」的資料裝進 vector——例如每個學生有三科成績,想要一個「裝三元組」的 vector。直覺會寫 vector<int[3]>,但行不通:vector 的元素必須能整個複製,而普通陣列偏偏不能(8.8t = s;10.6 開頭的「陣列不能 a = b」都是同一個遺憾)——一對它 push_back,編譯器就翻臉。pair 也幫不上忙——它只綁兩個值。

這就是 array 容器的舞台。它定義在 <array> 裡,角括號給兩個參數:元素型態和大小——大小是型態的一部分,宣告後不能改變。用起來跟普通陣列幾乎一樣([i] 取值、越界一樣是 UB),但它把陣列包裝成可以整個複製、指派的型態——普通陣列的那個遺憾補上了,所以能當 vector 的元素;身為正牌容器,還多了 size() 等標準配備:

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

int main() {
    array<int, 3> a = {7, 8, 9};       // 大小 3 是型態的一部分,宣告時就固定
    cout << a[0] << ' ' << a.size() << '\n';

    vector<array<int, 3>> v;           // 裝「三個一組」資料的 vector
    v.push_back({1, 2, 3});
    v.push_back({4, 5, 6});
    cout << v[1][2] << '\n';           // 索引 1 那組的第 2 個元素
    return 0;
}

執行結果:

7 3
6

一句話總結:array = 披上容器外衣的普通陣列。平常寫程式用普通陣列就好;需要「固定 k 個一組」的資料進 vector 時,再請它出場。