最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<array>

# std::array(C++11)

    namespace std {
      template <class T, std::size_t N>
      struct array;
    }

## 概要

`array`は固定長のオブジェクトを保持するシーケンスコンテナで、各要素は連続して格納される。従来のCスタイルの配列のパフォーマンスを保ったまま、シーケンスのサイズの取得、要素の代入のサポートなど、標準コンテナの恩恵を受ける事ができる。また、境界チェック（範囲外の要素にアクセスしようとしていないかのチェック）付きの要素アクセスもサポートしている。

`array`は、デフォルトコンストラクタで構築された`array`オブジェクトが空でない点と、`swap()`の計算量が定数時間でない点を除いて、コンテナとリバーシブルコンテナの全ての要件を満たす。

テンプレートパラメータは、以下を意味する：

- `T` : 配列の要素型
- `N` : 配列の要素数。`0`以上であること

## メンバ関数

### 構築／破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(initializer)` | `array`の初期化 | C++11

### 要素へのアクセス

名前 | 説明 | 対応バージョン
--- | --- | ---
`at` | 境界チェック付きの要素アクセス | C++11
`operator[]` | 境界チェック無しの要素アクセス | C++11
`front` | 先頭要素への参照を取得する | C++11
`back` | 末尾要素への参照を取得する | C++11
`data` | コンテナ内部に保持されている生の配列へ直接アクセスする | C++11

### イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`begin` | 先頭要素を指すイテレータを取得する | C++11
`end` | 末尾の1つ次の要素を指すイテレータを取得する | C++11
`cbegin` | 先頭要素を指す読み取り専用イテレータを取得する | C++11
`cend` | 末尾の次の要素を指す読み取り専用イテレータを取得する | C++11
`rbegin` | 末尾の要素を指す逆イテレータを取得する | C++11
`rend` | 先頭の1つ前の要素を指す逆イテレータを取得する | C++11
`crbegin` | 末尾の要素を指す読み取り専用逆イテレータを取得する | C++11
`crend` | 先頭の1つ前の要素を指す読み取り専用逆イテレータを取得する | C++11

### 領域

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | コンテナが空かどうかを判定する | C++11
`size` | 要素数を取得する | C++11
`max_size` | 格納可能な最大の要素数を取得する | C++11

### コンテナの変更

名前 | 説明 | 対応バージョン
--- | --- | ---
`fill` | コンテナを特定の要素で埋める | C++11
`swap` | 別の`array`オブジェクトとコンテナの中身を入れ替える | C++11

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`reference` | 要素の参照型 `T&` | C++11
`const_reference` | 読取り専用の要素の参照型 `const T&` | C++11
`iterator` | ランダムアクセスイテレータ (実装定義) | C++11
`const_iterator` | 読取り専用のランダムアクセスイテレータ (実装定義) | C++11
`reverse_iterator` | 逆イテレータ `reverse_iterator<iterator>` | C++11
`const_reverse_iterator` | 読み取り専用の逆イテレータ `reverse_iterator<const_iterator>` | C++11
`size_type` | 符号なし整数型 `size_t` | C++11
`difference_type` | 符号付き整数型 `ptrdiff_t` | C++11
`pointer` | 要素のポインタ型 `T*` | C++11
`const_pointer` | 読取り専用の要素のポインタ型 `const T*` | C++11
`value_type` | 要素の型 `T` | C++11

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++11
`operator!=` | 非等値比較 | C++11
`operator<=>` | 三方比較 | C++20
`operator<` | 左辺が右辺より小さいかの判定を行う | C++11
`operator<=` | 左辺が右辺以下かの判定を行う | C++11
`operator>` | 左辺が右辺より大きいかの判定を行う | C++11
`operator>=` | 左辺が右辺以上かの判定を行う | C++11
`swap` | 2つの `array` オブジェクトを入れ替える | C++11

## 配列作成関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`to_array` | 組み込み一次元配列から `array` を作成する | C++20

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++17

## タプルインタフェースサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`tuple_size` | 静的な要素数取得(class template) | C++11
`tuple_element` | 静的な要素の型取得(class template) | C++11
`get` | 要素を取得する(function template) | C++11

## 例

    #include <iostream>
    #include <array>
    #include <algorithm>

    int main()
    {
      // 3要素のint型配列を定義し、初期化子リストで初期化
      std::array<int, 3> ar = {3, 1, 4};

      // size()メンバ関数による要素数取得
      for (std::size_t i = 0; i < ar.size(); ++i) {
        ++ar[i]; // operator[]で任意の要素にランダムアクセス
      }

      // イテレータによる要素の横断
      std::for_each(ar.begin(), ar.end(), [](int x) {
        std::cout << x << std::endl;
      });
    }

### 出力

    4
    2
    5

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2008 (std::tr1) ✅, 2010 ✅, 2012 ✅

## 関連項目

- C++14 宣言時のメンバ初期化を持つ型の集成体初期化を許可

## 参照