前言
本文承接前文的主題,繼續介紹 C++ 的陣列。本文的主題是 std::array
物件。這類物件提供的方法具有邊界檢查,和 C 陣列相異。
建立陣列
使用以下語法建立 std::array
物件。初始化時要指定資料型態和元素個數:
std::array<int, 5> arr = {3, 4, 5, 6, 7};
這裡用到一些泛型程式的語法。目前還不需自己寫泛型程式,只要會用現存的泛型程式即可。
也可以用新式的初始化語法來建立 std::array
物件:
std::array<int, 5> arr { {3, 4, 5, 6, 7} };
存取陣列的元素
std::array
物件同樣使用非負整數做為索引 (index) 來存取陣列元素。使用 std::array
的 at
方法 (method) 存取元素的方式如下:
#include <array>
#include <cassert>
int main(void)
{
std::array<int, 5> arr = {3, 4, 5, 6, 7};
assert(arr.at(0) == 3);
assert(arr.at(2) == 5);
assert(arr.at(4) == 7);
arr.at(2) = 99;
assert(arr.at(0) == 3);
assert(arr.at(2) == 99);
assert(arr.at(4) == 7);
return 0;
}
使用 at
方法存取陣列元素時,會自動進行邊界檢查。出現異常存取時會拋出例外 (exception)。
如果不需要邊界檢查,可以用原本的陣列運算子來存取 std::array
物件:
#include <array>
#include <cassert>
int main(void)
{
std::array<int, 5> arr = {3, 4, 5, 6, 7};
assert(arr[0] == 3);
assert(arr[2] == 5);
assert(arr[4] == 7);
arr[2] = 99;
assert(arr[0] == 3);
assert(arr[2] == 99);
assert(arr[4] == 7);
return 0;
}
其實 std::array
物件的陣列運算子覆寫了 (overloading) 內建的陣列運算子,而且在行為上刻意和內建陣列運算子保持一致。
走訪陣列
std::array
陣列物件具有三種走訪方式。傳統的計數器仍然是可用的:
#include <array>
#include <cstddef>
#include <iostream>
int main(void)
{
std::array<int, 5> arr = {3, 4, 5, 6, 7};
for (size_t i = 0; i < arr.size(); i++) {
std::cout << arr[i] << std::endl;
}
return 0;
}
由於 std::array
內部有存陣列的大小,可以直接透過其 size
方法來取得。
當然也可以使用隱式的迭代器來走訪陣列:
#include <array>
#include <iostream>
int main(void)
{
std::array<int, 5> arr = {3, 4, 5, 6, 7};
for (auto i : arr) {
std::cout << i << std::endl;
}
return 0;
}
這時候不能修改陣列元素。如果要在走訪時修改陣列元素,要改用顯式的迭代器來走訪陣列:
#include <array>
#include <iostream>
int main(void)
{
std::array<int, 5> arr = {3, 4, 5, 6, 7};
for (auto iter = arr.begin(); iter != arr.end(); ++iter) {
std::cout << *iter << std::endl;
}
return 0;
}