C++復習(三):STLライブラリのdeque、stack、queue、priority_queueコンテナ

3036 ワード

本文の主な参考https://blog.csdn.net/weixin_34128839/article/details/91686932
Queue,stackはdequeに基づいて実現され,いずれもシーケンスコンテナであり,ランダムアクセスをサポートする.priority_queueはvectorに基づいて実現され,下位データ構造はスタックである.
一般的に最小ヒープ、最大ヒープが必要な場合はpriority_queueで実現します.
一般的にキューを使用する必要がある場合はqueueで実現できます.
一般的にスタックを使用する必要がある場合はstackで実現できます.
一般的に双方向キューを使用する必要がある場合はdequeで実現できます.
次の段落のためにリストを紹介します.Listの本質は双方向チェーンテーブルであり,メモリ空間が不連続でポインタによる操作である.
dequeはdouble-ended queueであり、複数の連続メモリブロックから構成され、dequeはlistとvectorの互換性であり、複数のブロックに分けられ、各ブロックサイズは512バイトであり、ブロックはmapブロックによって管理され、mapブロックには各ブロックのヘッダアドレスが保存される.そのため、このコンテナにはインデックス操作operator[]もあり、効率はvectorほど高くありません.またdequeはvectorより多くpush_front()とpop_front()操作は,両端でこの操作を行うとlistとの効率があまり悪くない.
1、構築と付与
#include
//#include    stack queue      deque
#include
#include    //queue     priority_queue
#include
using namespace std;

//  int,string         ,    struct class            
//deque          vector  。
deque dq1(5, "hello");    //       5、   "hello" deque
deque dq2 = { 9,5,2,7 };    //    deque   {9,5,2,7}
//           ,   dequeue       
deque dq3;
queue q1;    //     queue。     ,    。
stack st1;    //     stack。     ,    。
priority_queue pr_q1;    //     priority_queue。     ,    。          ,    /   。
priority_queue, less> pr_q2;    //   ,        。          。
priority_queue, greater> pr_q3;    //   ,        ,    /   。
 
//    ,       ,            
//dq2[1] = 6;    //dq2  {9,6,2,7}

2、大きさ
一般的には使用されません.キューやスタックのサイズにはあまり注目しません.空であるかどうかだけに注目します.
dq2.size()    //  dq2      , dq2   ,  4。
dq2.max_size()    //               。             ,               ,              ,               。            。

3、インスタック、アウトスタック、インキュー、アウトキュー、エンドポイント値の取得
//dequeue,    
dq3.push_back(2);    //    。    {2}
dq3.push_front(5);    //    。    {5,2}
dq3.back();    //       。  2
dq3.front();    //       。  5
dq3.pop_back();    //    。    {5}
dq3.pop_front();    //    。    {}

//queue,    
q1.push(2);    //    。    {2}
q1.push(5);    //    。    {2,5}
q1.back();    //      。  5
q1.front();    //      。  2
q1.pop();    //    。    {5}

//stack, 
st1.push(2);	//  。   {2}
st1.push(5);	//  。   {2,5}
st1.top();	//       。  5
st1.pop();	//  。   {2}

//priority_queue,     
//           ,            ,           。
pr_q1.push(2);	//  。    {2}
pr_q1.push(5);	//  。    {5,2}
pr_q1.push(3);	//  。    {5,3,2}
pr_q1.top();	//           。  5
pr_q1.pop();	//  。    {3,2}

4、判断が空か
dq2.empty();    //   ,   True,    False。      
q1.empty();
st1.empty();
pr_q1.empty();

5、priority_queueの優先度設定
キュー内の要素がint、stringなどの比較可能な要素である場合、上記のメンバー関数を直接使用できます.
キュー内の要素がstruct,classなどの要素である場合は、比較関数(たとえば、番号オペレータより小さい)を再ロードします.詳細については、https://blog.csdn.net/hellokandy/article/details/81458663.