array

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
  

関連項目

list

vector


コンテナ目次 C++目次 inserted by FC2 system