queue / stack / priority_queue ― コンテナアダプタこの 3 つは既存のコンテナに「使える操作を絞った薄い皮」を被せたもので、コンテナアダプタと呼ばれます。内部は deque や vector を使い、その一部の機能だけを露出します。queue は FIFO(先入れ先出し)、stack は LIFO(後入れ先出し)、priority_queue は常に最大(または最小)を取り出す優先度付きキュー。「これしかやらない」と宣言できることでコードの意図が明快になります。
std::queue:push / pop / front(FIFO)std::stack:push / pop / top(LIFO)std::priority_queue:push / pop / top(最大値)priority_queue でヒープ・最小値にする方法これらのアダプタは新しいコンテナを実装しているわけではありません。既存の deque や vector を内部に持ち、「使えるメソッドを絞った API」を外に見せているだけ。
外側: std::queue<int> ← 使える API: push / pop / front / back / size
│
↓ 内部に抱える
内側: std::deque<int> ← 本体(機能はぜんぶ持っている)
q.push と q.pop しか出てこないことが保証されるので、変な使われ方を心配する必要がない。
begin() / end() / 範囲 for は使えず、front(または top)と pop を繰り返して消費するのが想定された使い方。中身を眺めたいなら deque / vector を直接使います。
std::queue ― FIFO先入れ先出し。最初に入れた要素から順に取り出せます。内部はデフォルトで std::deque。
q.push(x) ― 末尾に追加q.pop() ― 先頭を削除(戻り値なし)q.front() / q.back() ― 先頭/末尾を参照(削除はしない)q.size() / q.empty()std::stack ― LIFO後入れ先出し。最後に入れた要素から順に取り出せます。内部はデフォルトで std::deque。
st.push(x) ― 頂上に積むst.pop() ― 頂上を取り除く(戻り値なし)st.top() ― 頂上を参照(削除はしない)st.size() / st.empty()std::priority_queue ― 優先度付きキュー常に最大値(または最小値)を取り出せる特殊なキュー。内部はデフォルトで std::vector にヒープ構造を構築しています。
push ― O(log n)pop ― O(log n)top ― O(1)(参照のみ)デフォルトは最大値。最小値を取り出したいなら std::greater を渡します。
deque を使うべき?FIFO / LIFO は std::deque を直接使っても実現できます(push_back + pop_front で queue、push_back + pop_back で stack)。それでもアダプタを使うメリットは意図の明示。
| 観点 | アダプタ(queue / stack) | 直接 deque |
|---|---|---|
| 意図が読める | FIFO / LIFO と明確 | 何をしているか要確認 |
| 使える操作 | 絞られている(誤用を防げる) | 全部使える(柔軟だが乱用リスク) |
| 反復/全走査 | 不可 | 範囲 for OK |
| 内部コンテナ | デフォルト deque(変更可) | deque そのもの |
| 性能 | deque と同じ(インライン展開) | deque そのもの |
std::queue / std::stack、途中で中身を覗く必要があるなら std::deque を直接使う。priority_queue は代替が面倒(自前でヒープを管理するのは現実的ではない)なので、ほぼ常にアダプタを使います。
2 問。
std::stack<int> st に 1, 2, 3 を順に push したあと、st.top() が返す値は?stack は LIFO(後入れ先出し)。最後に push した 3 が頂上。top() は参照のみで、取り除きたいなら pop()。std::priority_queue<int> pq に 3, 1, 4, 1, 5 を push したあと、top() / pop() を繰り返して出力すると?std::priority_queue は最大ヒープ。常に最大値が top にくるので、取り出しは大きい順。重複はそのまま残ります。小さい順にしたければ std::greater を第 3 テンプレート引数で渡します。