arrayは、C++11で導入された配列として機能するコンテナです。arrayは固定長の要素を複数保存できるシーケンスコンテナです。 配列との最も大きな違いは、境界チェック(範囲外の要素にアクセスしようとしていないかのチェック)を行うことができるので、 配列よりも安全に使うことができるという点です。
要素を識別するためにインデックスを指定することができます(その場合は範囲チェックは行われません)。
ar[8] = 10; // 宣言がstd::array arの場合、間違い
at()でアクセスすると実行時に範囲がチェックされます。
ar.at(8) = 10; // 宣言がstd::array arの場合、範囲外の要素への代入
このようなコードを実行するとstd::out_of_rangeがスローされるようになります。
次のような例外処理のコードを記述すれば、メッセージを出力して実行を継続することができます。
try {
ar.at(8) = 10;
}
catch (const std::out_of_range& e) {
std::cerr << "arrayの範囲を超えました。\n";
}
なお、イテレーターで個々の要素にアクセスすることもできます。
std::for_each(ar.begin(), ar.end(), [](int x)
std::cout << x << " ";
イテレーターを使う方法でも範囲外にアクセスする危険性がなくなります。
次の例は、次の例は、arrayコンテナに要素を保存して出力するコードの例です。
#include <iostream>
#include <array>
#include <algorithm> // for_eachのためにインクルード
int main()
{
std::array<int, 5> ar = {1, 3, 5, 7, 9};
// インデックスで出力
for (std::size_t i = 0; i < ar.size(); ++i) {
std::cout << ar[i] << " ";
}
std::cout << std::endl;
// 偶数の配列を作って要素を全て入れ替える
std::array<int, 5> are = { 0, 2, 4, 6, 8 };
ar.swap(are);
// イテレーターで出力
std::for_each(ar.begin(), ar.end(), [](int x) {
std::cout << x << " ";
});
std::cout << std::endl;
}
このプログラムをコンパイルして実行する例を次に示します。
1 3 5 7 9
0 2 4 6 8