10.12 array:披上容器外衣的陣列(延伸知識)
想把「固定幾個一組」的資料裝進 vector——例如每個學生有三科成績,想要一個「裝三元組」的 vector。直覺會寫 vector<int[3]>,但行不通:vector 的元素必須能整個複製,而普通陣列偏偏不能(8.8 的 t = 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 時,再請它出場。