25日目 C++キューコンテナ(キュー)

キューの基本概念

意味

C++ では、キュー (キュー) は先入れ先出し (FIFO) の原理を採用する一般的なデータ構造であり、2 つの出口があります。キューの特徴は、一方の端 (末尾) での挿入と、もう一方の端 (先頭) での削除のみが許可されることです。キューでは、最初に追加された要素のみがアクセスして操作できますが、後から追加された要素は、前の要素が処理されるまで待機してからアクセスする必要があります。

ここに画像の説明を挿入

知らせ

C++ 標準ライブラリでは、std::queueテンプレート クラスを使用してキューを実装できます。ヘッダー ファイルを導入する必要があります。<queue>
キュー コンテナでは、一方の端から要素を追加し、もう一方の端から要素を削除できます。
外部から使用できるのはキューの先頭と末尾のみであるため、キューのトラバーサル動作は許可されません

C++ 標準ライブラリのQueue( std::queue)は、それ自体では直接インデックス機能を提供しませんキューは先入れ先出しデータ構造であるため、挿入操作はキューの最後でのみ実行でき、削除操作はキューの先頭でのみ実行できます。インデックスを介して要素にアクセスすることはできません。配列やベクトルなど。
インデックス関数を使用してキューを実装するには、ベクトル ( std::vector) やリンク リスト ( std::list)などの他のデータ構造を使用して実装を支援できます。

基本的な考え方

フロント - キュー内で最も早く追加された要素の位置を指します。
Rear - キューに追加された最後の要素の位置を指します。
エンキュー - キューの最後に要素を追加します。
デキュー - キューの先頭から要素を削除します。
空 - キューに要素がない場合、それは空と呼ばれます。
キュー サイズ (Size) - キュー内の要素の数を示します。

キュー共通インターフェース

コンストラクタ

  • queue<T> que;キューはテンプレート クラスとキュー オブジェクトのデフォルトの構築形式によって実装されます。
  • queue(const queue &que);コピーコンストラクター

代入演算

  • queue& operator=(const queue &que);オーバーロードされた等号演算子

データアクセス

  • push(elem);キューの最後に要素を追加します
  • pop();キューの先頭から最初の要素を削除します
  • back();最後の要素を返します
  • front(); 最初の要素を返します

サイズ操作

  • empty();スタックが空かどうかを確認する
  • size(); スタックのサイズを返す

コード

#include <iostream>
#include <queue>

int main() {
    
    
    std::queue<int> que;
    
    // 往队尾添加元素
    que.push(10);
    que.push(20);
    que.push(30);

    // 返回第一个元素
    std::cout << "队头元素为:" << que.front() << std::endl;

    // 返回最后一个元素
    std::cout << "队尾元素为:" << que.back() << std::endl;

    // 移除第一个元素
    que.pop();

    // 再次返回第一个元素
    std::cout << "队头元素为:" << que.front() << std::endl;

    // 获取队列的大小
    std::cout << "队列的大小为:" << que.size() << std::endl;

    // 判断队列是否为空
    if (que.empty()) {
    
    
        std::cout << "队列为空" << std::endl;
    }
    return 0;
}

操作の結果は次のようになります。

キューの先頭の要素: 10
キューの末尾の要素: 30
キューの先頭の要素: 20
キューのサイズ: 2

分析する

この例では、整数キュー オブジェクト std::queue que を作成し
、push(elem) メソッドを通じてキューの末尾に要素 10、20、および 30 を追加します。front
() メソッドを使用して、その最初の要素の値を取得します。キュー
back() メソッドを使用してキューの最後の要素の値を取得し、
次に、pop() メソッドを使用してキューの最初の要素を削除し、
最後に size() メソッドを使用してキューのサイズを返します。キュー
が空かどうかを確認するには、empty() メソッドを使用します。

要約する

  • エンキュー — プッシュ
  • デキュー — ポップ
  • キューの先頭要素 (フロント) を返します。
  • キューの最後にある要素を返す - 戻る
  • チームが空かどうかを判断する (空)
  • キューのサイズを返します — size

キューアプリケーションのシナリオ

タスクのスケジュール設定

マルチタスク システムでは、キューを使用して保留中のタスクを管理できます。新しいタスクが到着すると、それはキューの最後に追加され、タスクが実行されると、タスクはキューの先頭から取り出されて処理されます。これにより、タスクを到着順に順次実行することができ、公平性を保証することができる。

メッセージング

メッセージ キュー システムでは、キューを使用してメッセージを配信できます。プロデューサはメッセージをキューの最後に置き、コンシューマはキューの先頭からメッセージを取得して処理します。これにより非同期通信が可能となり、システムの拡張性と信頼性が向上します。

緩衝地帯

データ処理中に、キューをバッファとして使用して、プロデューサーとコンシューマー間の速度差のバランスを取ることができます。プロデューサはデータをキューに入れることができ、コンシューマは処理のためにキューからデータを取得します。このようにして、プロデューサーとコンシューマーの間の直接の対話を回避でき、システムのパフォーマンスと安定性を向上させることができます。

ネットワークリクエストの処理

サーバー側アプリケーションでは、キューを使用してクライアントからの要求を処理できます。新しいリクエストが到着すると、キューの最後尾に配置され、キューの順序に従って順番に処理されます。これにより、同時に大量のリクエストを処理することによるシステムの過剰な負荷を回避し、同時にシステムの応答速度を向上させることができます。

スレッドプールタスクのスケジューリング

マルチスレッド プログラミングでは、キューを使用して保留中のタスクを管理できます。タスクをキューの最後に置くと、スレッド プール内のスレッドがキューの先頭からタスクを取り出して実行します。これにより、スレッドが多すぎることによるリソースの競合やパフォーマンスの低下を回避し、タスクを秩序正しく実行できます。

おすすめ

転載: blog.csdn.net/m0_74921567/article/details/132182482