# 優先度付きキューの話（メロリンキュー）

# queue と priority\_queue の違い

― FIFO と「優先度」の正体 ―

## 1. このページの目的

C++ STL には複数の「キュー系コンテナ」が存在します。  
本ページでは、次のコードを題材に、

- `<span class="editor-theme-code">std::queue</span>`（通常のキュー）
- `<span class="editor-theme-code">std::priority_queue</span>`（優先度付きキュー）

<span style="white-space: pre-wrap;">の </span>****動作原理と使いどころの違い****<span style="white-space: pre-wrap;"> を整理します。</span>

<span style="white-space: pre-wrap;">対象は </span>****C++ が書けるゲームエンジニア科 2 年生****です。  
STL の仕様寄りの説明を行います。

---

## 2. 使用するサンプルプログラム

### 2.1 プログラム全体

```c++
#include <iostream>
#include <queue>

namespace {
    std::priority_queue<int, std::vector<int>, std::greater<int>> myQueue;
    std::queue<int> ituQueue;
}

int main()
{
    ituQueue.push(10);
    ituQueue.push(3);
    ituQueue.push(5);
    ituQueue.push(8);
    ituQueue.push(2);

    for(int i = 0; i < 5; ++i) {
        int val = ituQueue.front();
        ituQueue.pop();
        std::cout << "Pop: " << val << std::endl;
    }

    std::cout << "-----------------------------" << std::endl;

    myQueue.push(10);
    myQueue.push(3);
    myQueue.push(5);
    myQueue.push(8);
    myQueue.push(2);

    for (int i = 0; i < 5; ++i) {
        int val = myQueue.top();
        myQueue.pop();
        std::cout << "Pop: " << val << std::endl;
    }

    return 0;
}
```

---

## 3. std::queue の挙動（FIFO）

### 3.1 std::queue とは

`<span class="editor-theme-code">std::queue</span>`<span style="white-space: pre-wrap;"> は </span>****FIFO（First In, First Out）****<span style="white-space: pre-wrap;"> のキューです。</span>

- 先に入れたものが
- 先に出てくる

<span style="white-space: pre-wrap;">という </span>****順番固定****<span style="white-space: pre-wrap;"> のデータ構造です。</span>

---

### 3.2 実行結果（queue）

```
Pop: 10
Pop: 3
Pop: 5
Pop: 8
Pop: 2
```

### 3.3 なぜこの順番になるか

```cpp
ituQueue.push(10);
ituQueue.push(3);
ituQueue.push(5);
ituQueue.push(8);
ituQueue.push(2);
```

投入順そのままに、

```
10 → 3 → 5 → 8 → 2
```

<span style="white-space: pre-wrap;">が </span>`<span class="editor-theme-code">front()</span>`<span style="white-space: pre-wrap;"> → </span>`<span class="editor-theme-code">pop()</span>`<span style="white-space: pre-wrap;"> で取り出されます。</span>

---

### 3.4 queue の用途

- イベントキュー
- 入力処理
- 通信パケット処理
- BFS（幅優先探索）

「****順番を守ること****」が最優先の処理向きです。

---

## 4. std::priority\_queue の挙動（優先度付き）

### 4.1 priority\_queue とは

`<span class="editor-theme-code">std::priority_queue</span>`<span style="white-space: pre-wrap;"> は、</span>

> ****「順番」ではなく「優先度」で取り出されるキュー****

です。

投入順は一切保証されません。

---

### 4.2 宣言の意味

```cpp
std::priority_queue<int, std::vector<int>, std::greater<int>> myQueue;
```

各要素の意味は以下です。

<table id="bkmrk-%E8%A6%81%E7%B4%A0%E6%84%8F%E5%91%B3int%E6%A0%BC%E7%B4%8D%E3%81%99%E3%82%8B%E5%9E%8Bstd%3A%3Avec"><colgroup><col></col><col></col></colgroup><tbody><tr><th>要素

</th><th>意味

</th></tr><tr><td>`<span class="editor-theme-code">int</span>`

</td><td>格納する型

</td></tr><tr><td>`<span class="editor-theme-code">std::vector<int></span>`

</td><td>内部コンテナ（ヒープ用）

</td></tr><tr><td>`<span class="editor-theme-code">std::greater<int></span>`

</td><td>比較規約

</td></tr></tbody></table>

---

### 4.3 比較規約の重要ルール

`<span class="editor-theme-code">priority_queue</span>`<span style="white-space: pre-wrap;"> では次の規約が使われます。</span>

> ****Compare(a, b) == true のとき、a は b より優先度が低い****

---

### 4.4 std::greater&lt;int&gt; の意味

```cpp
std::greater<int>()(a, b)  // a > b
```

- `<span class="editor-theme-code">a > b == true</span>`
- <span style="white-space: pre-wrap;">→ </span>****a は後回し****
- <span style="white-space: pre-wrap;">→ </span>****小さい値ほど優先****

つまり、

<span style="white-space: pre-wrap;">📌 </span>****最小値が常に top() に来る****

---

### 4.5 実行結果（priority\_queue）

```
-----------------------------
Pop: 2
Pop: 3
Pop: 5
Pop: 8
Pop: 10
```

### 4.6 なぜこの順番になるか

投入順：

```
10, 3, 5, 8, 2
```

<span style="white-space: pre-wrap;">内部では </span>****ヒープ構造****<span style="white-space: pre-wrap;"> が作られ、</span>

```
常に最小値が top()
```

になります。

---

## 5. queue と priority\_queue の本質的違い

<table id="bkmrk-%E9%A0%85%E7%9B%AEstd%3A%3Aqueuestd%3A%3Apri"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>項目

</th><th>std::queue

</th><th>std::priority\_queue

</th></tr><tr><td>取り出し基準

</td><td>入れた順

</td><td>優先度

</td></tr><tr><td>順序保証

</td><td>あり

</td><td>なし

</td></tr><tr><td>内部構造

</td><td>deque

</td><td>heap（vector）

</td></tr><tr><td>top / front

</td><td>front()

</td><td>top()

</td></tr></tbody></table>

---

## 6. ゲーム開発での典型用途

### 6.1 std::queue

- 入力イベント処理
- メッセージキュー
- BFS（迷路探索など）

---

### 6.2 std::priority\_queue

- A\* / ダイクストラ法
- タスクスケジューラ
- 距離・コスト最小探索
- AI 思考順制御

---

## 7. 自作構造体での使用例（探索系）

```c++
struct Node {
    int cost;
};

// cost が小さいほど優先
bool operator>(const Node& a, const Node& b)
{
    return a.cost > b.cost;
}

std::priority_queue<Node, std::vector<Node>, std::greater<Node>> open;
```

```c++
open.push({10});
open.push({3});
open.push({7});

open.top().cost; // 3
```

---

## 8. まとめ

- `<span class="editor-theme-code">std::queue</span>`
    - ****順番重視****
    - FIFO
- `<span class="editor-theme-code">std::priority_queue</span>`
    - ****優先度重視****
    - 最小 or 最大ヒープ

探索アルゴリズムでは  
****「次に処理すべきもの」を選ぶために priority\_queue が使われる****  
という点を押さえておくと、実装の意味が見えてきます。