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

履歴 編集

class template
<stack>

# std::stack

    namespace std {
      template <class T, class Container = deque<T>>
      class stack;
    }

## 概要

`stack` はコンテナアダプタであり、LIFO (last-in first-out) の動作――コンテナの一方から要素が挿入され、挿入された側から要素を取り出す――を実現する目的で設計されている。要素をコンテナの `back()` 側から挿入し、同じく `back()` 側から取り出す。

`stack` は、所定のメンバ関数を持つコンテナのオブジェクトを内部実装として用いており、標準のコンテナ、もしくは独自に実装したコンテナを指定することができる。 このコンテナに必要な要件は、以下のメンバ関数を持つことである。

- `back()`
- `push_back()`
- `pop_back()`
- `emplace_back()` (C++11)

この要件を満たすものとしては `vector` 、`deque` 、`list` があり、デフォルトでは `deque` が使用される。

`stack` は2つのテンプレートパラメータを持つ。各テンプレートパラメータの意味は以下の通りである。

- `T`: 格納される要素の型
- `Container`: 要素へのアクセス・保存に用いる内部実装のコンテナクラス

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ |
`(destructor)` | デストラクタ |
`operator=` | 代入 |
`top` | 次の要素へアクセスする |
`empty` | 要素が空であるかを確認する |
`size` | 要素数を取得する |
`push` | 要素を追加する |
`push_range` | Rangeの要素を追加する | C++23
`emplace` | 直接構築で要素を追加する | C++11
`pop` | 次の要素を削除する |
`swap` | 他の `stack` オブジェクトと値を入れ替える | C++11

## protectedメンバ変数

変数名 | 型 | 対応バージョン
--- | --- | ---
`c` | `Container` |

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`container_type` | `Container` |
`value_type` | `Container::value_type` |
`size_type` | `Container::size_type` |
`reference` | `Container::reference` | C++11
`const_reference` | `Container::const_reference` | C++11

## 非メンバ関数

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

## 推論補助

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

## 例

    #include <iostream>
    #include <stack>

    int main ()
    {
      std::stack<int> st;

      // 要素を追加
      st.push(1);
      st.push(2);
      st.push(3);

      while (!st.empty()) {
        std::cout << st.top() << " "; // 末尾要素を参照する
        st.pop(); // 末尾要素を削除
      }
    }

### 出力

    3 2 1

### 参照