C++ で STL キューコンテナを使用する

胡金庫 2023年10月12日
  1. C++ で std::queue を使用して STL キューオブジェクトを宣言する
  2. C++ で size メンバー関数を使用してキューのサイズを取得する
  3. C++ で swap メンバー関数を使用して 2つのキューオブジェクトのコンテンツを交換する
C++ で STL キューコンテナを使用する

この記事では、C++ で STL キューコンテナを利用する方法について説明します。

C++ で std::queue を使用して STL キューオブジェクトを宣言する

C++ 標準ライブラリは、オブジェクトのコレクションを管理するための基本的な型を提供するために使用されるいくつかのコンテナクラスを提供します。ただし、コンテナアダプタと呼ばれる特別なコンテナがいくつかあります。これは、最も制限されたインターフェイスを使用して、特別なニーズに合わせて基本的なコンテナを変換します。

これらのコンテナアダプタの 1つは std::queue です。これは、シーケンスコンテナを適合させて FIFO(先入れ先出し)データ構造を提供します。基盤となる基本コンテナは SequenceContainer 要件を実装し、backfrontpush_back、および pop_front の 4つのメンバー関数を持っている必要があることに注意してください。基本コンテナの std::deque および std::list 関数のみが上記の要件を満たしているため、queue 要素を格納するために使用できます。

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::queue;
using std::string;

template <typename Queue>
void printQueue(Queue q) {
  while (!q.empty()) {
    cout << q.front() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  std::queue<string> q1;
  std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};

  for (const auto& n : deq1) q1.push(n);
  printQueue(q1);

  std::queue<string> q2(deq1);
  printQueue(q2);

  return EXIT_SUCCESS;
}

出力:

one, eight, six, seven, eleven, ten,
one, eight, six, seven, eleven, ten,

std::queue コンテナは、既存の std::deque オブジェクトを使用して初期化できます。後者の初期化のコンストラクターは、タイプ deque の引数を 1つだけ必要とします。一方、キューオブジェクトを宣言し、push 関数を使用して要素を追加することができます。上記のコードスニペットでは、上記のメソッドを示し、printQueue 関数を使用してキューの内容を出力します。

キュー要素の反復は、イテレータにアクセスできないため、empty 関数を使用する while ループで実行されることに注意してください。各ループサイクルで、front メンバー関数を使用して最初の要素にアクセスし、pop を使用して同じ要素を削除します。後者の操作は元のキューオブジェクトを変更するため、参照ではなく値引数として受け入れます。

C++ で size メンバー関数を使用してキューのサイズを取得する

size メンバー関数を使用して、キューオブジェクト内の要素の数を取得できます。この関数のパフォーマンスは一定です。

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::queue;
using std::string;

int main() {
  std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};

  std::queue<string> q2(deq1);

  cout << "size of the queue = " << q2.size() << endl;

  return EXIT_SUCCESS;
}

出力:

size of the queue = 6

C++ で swap メンバー関数を使用して 2つのキューオブジェクトのコンテンツを交換する

swap メンバー関数を使用して、2つのキューオブジェクトの要素を交換できます。唯一の引数として別のキューオブジェクトを取り、その内容を呼び出し元オブジェクトと交換します。引数オブジェクトが呼び出し元キューの内容を割り当てたことに注意してください。

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::queue;
using std::string;

template <typename Queue>
void printQueue(Queue q) {
  while (!q.empty()) {
    cout << q.front() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  std::queue<string> q1;
  std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};

  for (const auto& n : deq1) q1.push(n);

  std::queue<string> q2(deq1);
  q2.push(deq1.front());
  q2.push("zero");

  cout << "q1: ";
  printQueue(q1);
  cout << "q2: ";
  printQueue(q2);

  q1.swap(q2);

  cout << "q1: ";
  printQueue(q1);
  cout << "q2: ";
  printQueue(q2);

  return EXIT_SUCCESS;
}

出力:

q1: one, eight, six, seven, eleven, ten,
q2: one, eight, six, seven, eleven, ten, one, zero,
q1: one, eight, six, seven, eleven, ten, one, zero,
q2: one, eight, six, seven, eleven, ten,
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Queue