[セットトップ]C++Primer学習ノート_33_STL実践と分析(7)--コンテナアダプタ



STL実践と分析
--コンテナアダプタ
引用:
標準ライブラリには、シーケンスコンテナに加えて、queue,priority_の3つのシーケンスコンテナアダプタが用意されています.Queueとstack、アダプタは標準ライブラリの概念であり、コンテナアダプタ、反復器アダプタ、関数アダプタを含む.
アダプタの一般的な操作とタイプ
size_type
このアダプタタイプの最大オブジェクト長を格納するのに十分なタイプです.
value_type
0
container_type
ベースコンテナタイプ、アダプタこのコンテナタイプで実装
Aa;
aという名前の空のアダプタを作成します
Aa(c);
aという新しいアダプタを作成し、cのコピーに初期化します.
リレーショナルオペレータ
すべてのアダプタですべてのリレーションシップオペレータがサポートされています:=,!=,<,<=,>,>=
1、アダプタを使用する場合、関連ヘッダファイルを含める必要があります.
[cpp] view plain copy print ?
#include   
  • #include   
  • #include <stack>
    #include <queue>
    

    2、ベースコンテナタイプを上書きする
    デフォルトのqueueとstackはdequeに基づいて実装され、priority_Queueはvectorコンテナで実装され、アダプタを作成するときに、1つのシーケンスコンテナをアダプタの2番目のタイプの実パラメータとして指定することで、関連するベースコンテナタイプを上書きします.
    [cpp] view plain copy print ?
    stack strStk;  
  • stack< string,vector > str_stk;  

  • stack< string,vector > str_stk2(strStk);    //Error  
  • stack< string,vector > str_stk3(str_stk);   //OK  
  •     stack<string> strStk;
        stack< string,vector<string> > str_stk;
        stack< string,vector<string> > str_stk2(strStk);    //Error
        stack< string,vector<string> > str_stk3(str_stk);   //OK
    

    stackアダプタに関連付けられたベースコンテナは、任意の順序コンテナタイプであってもよい.したがって、stackスタックはvector、list、またはdequeコンテナの上に構築することができる.queueアダプタでは、関連するベースコンテナにpush_を指定する必要があります.front演算はlistコンテナにのみ確立され、vectorコンテナには確立されません.priority_Queueアダプタはランダムアクセス機能を必要とするためvectorまたはdequeコンテナに設定できますがlistコンテナには設定できません.
    3、アダプターの関係演算はその中の要素を順次比較して実現する
    一、スタックアダプタ
    スタックコンテナアダプタがサポートする操作
    s.empty()
    スタックが空の場合はtrueを返し、そうでない場合はfalseを返します.
    s.size()
    スタック内の要素の数を返します.
    s.pop()
    スタックトップ要素は削除されますが、値は返されません.
    s.top()
    スタックトップ要素を返しますが、要素は削除されません.
    s.push(item)
    さいスタックおしこみげんそ
    [html] view plain copy print ?
    const stack::size_type stk_size = 10;  
  • stack intStk;  

  •   
  • int ix = 0;  

  • while (intStk.size() != stk_size)  
  • {  

  •     intStk.push(ix ++);  
  • }  

  •   
  • int err_cnt = 0;  

  • while (!intStk.empty())  
  • {  

  •     int val = intStk.top();  
  •     if (val != --ix)  

  •     {  
  •         cerr << "oops! expected " << ix  

  •              << " received " << val << endl;  
  •         ++err_cnt;  

  •     }  
  •     intStk.pop();  

  • }  
  •   

  • cout << "Our Program ran with " << err_cnt << " errors!" << endl;  
        const stack<int>::size_type stk_size = 10;
        stack<int> intStk;
    
        int ix = 0;
        while (intStk.size() != stk_size)
        {
            intStk.push(ix ++);
        }
    
        int err_cnt = 0;
        while (!intStk.empty())
        {
            int val = intStk.top();
            if (val != --ix)
            {
                cerr << "oops! expected " << ix
                     << " received " << val << endl;
                ++err_cnt;
            }
            intStk.pop();
        }
    
        cout << "Our Program ran with " << err_cnt << " errors!" << endl;
    

    デフォルトでは、スタックアダプタはdequeコンテナに確立されているため、dequeが提供する操作を使用してスタック機能を実現します.たとえば、次の文を実行します.
    [html] view plain copy print ?
    intStack.push(ix++);  
        intStack.push(ix++);
    

    この操作はpush_を呼び出すことによってbackオペレーションは、intStkがベースとするdequeオブジェクトが提供する.スタックはdequeコンテナに基づいて実装されますが、プログラマはdequeが提供する操作に直接アクセスできません.
    二、キューと優先順位キュー
    この2つのキューを使用するには、queueヘッダファイルを含める必要があります.
    キューと優先キューがサポートするアクション
    q.empty()
    キューが空の場合はtrueを返し、そうでない場合はfalseを返します.
    q.size()
    キュー内の要素の数を返します.
    q.pop()
    キューヘッダ要素は削除されますが、値は返されません.
    q.front()
    キューヘッダ要素を返しますが、削除しません.この操作はキューにのみ適用されます.
    q.back()
    最後の要素を返しますが、削除しません.この操作はキューにのみ適用されます.
    q.top()
    最も優先度の高い要素の値を返しますが、要素は削除されません.この操作は優先度キューにのみ適用されます.
    q.push(item)
    queueの場合、キューの最後に新しい要素を挿入し、priority_の場合Queue、優先度ベースの適切な場所に新しい要素を挿入
        priority_Queueでは、キューに格納されている要素の優先度を設定できます.このキューは、新しい要素をキューの末尾に直接配置するのではなく、優先度の低い要素の前に配置します.標準ライブラリのデフォルトでは、要素タイプの<オペレータを使用して、それらの間の優先度関係を決定します.
    [html] view plain copy print ?
    //P 302練習問題9.42
  • int main()  

  • {  
  • //    freopen("input","r",stdin);  

  •     stack strStk;  
  •     string val;  

  •   
  •     while (cin >> val)  

  •     {  
  •         strStk.push(val);  

  •     }  
  •   

  •     while (!strStk.empty())  
  •     {  

  •         val = strStk.top();  
  •         cout << val << endl;  

  •         strStk.pop();  
  •     }  

  • }  
    //P302   9.42
    int main()
    {
    //    freopen("input","r",stdin);
        stack<string> strStk;
        string val;
    
        while (cin >> val)
        {
            strStk.push(val);
        }
    
        while (!strStk.empty())
        {
            val = strStk.top();
            cout << val << endl;
            strStk.pop();
        }
    }
    

    [cpp] view plain copy print ?
    //練習問題9.43
  • int main()  

  • {  
  •     freopen("input","r",stdin);  

  •     stack sexp;  
  •     string exp;  

  •     cin >> exp;  
  •   

  •     string::iterator iter = exp.begin();  
  •     while (iter != exp.end())  

  •     {  
  •         if (*iter != ')')  

  •         {  
  •             sexp.push(*iter);  

  •         }  
  •         else  

  •         {  
  •             while (!sexp.empty() && sexp.top() != '(')  

  •             {  
  •                 cout << sexp.top() << endl;  

  •                 sexp.pop();  
  •             }  

  •             if (sexp.top() == '(')  
  •             {  

  •                 sexp.pop();  
  •                 sexp.push('@');  

  •             }  
  •             else  

  •             {  
  •                 cerr << "No match ( !" << endl;  

  •                 return 0;  
  •             }  

  •         }  
  •         ++iter;  

  •     }  
  •   

  •     while (!sexp.empty())  
  •     {  

  •         cout << sexp.top() << endl;  
  •         sexp.pop();  

  •     }  
  • }