C ++:コンテナーアダプターについて

アダプターとは

アダプターは設計パターン(設計パターンは繰り返し使用されるセットであり、ほとんどの人は知っている、分類されたカタログ、コード設計経験の要約)であり、パターンはクラスインターフェースを顧客が望む別のインターフェースに変換する。
ここに画像の説明を挿入

スタック、キュー、priority_queueがコンテナーアダプターと呼ばれる理由

stack、queue、priority_queueにも要素を格納できますが、STLではコンテナのランクに分けられていませんが、各コンテナの下部に独自の実装があるため、コンテナアダプタと呼ばれています。そして、stack、queue、priority_queueは、以下のような他のコンテナを下部にカプセル化します。

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

シミュレーション実装スタック、キュー、priority_queue

コード例:

namespace bit
{
#include<deque>
    template<class T, class Con = deque<T>>
    class stack
    {
    public:
        stack() 
        {}

        void push(const T& x) 
        { 
            _c.push_back(x); 
        }

        void pop() 
        { 
            _c.pop_back(); 
        }

        T& top() 
        { 
            return _c.back(); 
        }

        const T& top()const 
        { 
            return _c.back(); 
        }

        size_t size()const 
        { 
            return _c.size(); 
        }

        bool empty()const 
        { 
            return _c.empty(); 
        }
    private:
        Con _c;
    };
}

namespace bit {
#include<deque>
    template<class T, class Con = deque<T>>
    class queue
    {
    public:
        queue() 
        {}

        void push(const T& x) 
        { 
            _c.push_back(x); 
        }

        void pop() 
        { 
            _c.pop_front(); 
        }

        T& back() 
        { 
            return _c.back(); 
        }

        const T& back()const 
        { 
            return _c.back(); 
        }

        T& front() 
        { 
            return _c.front(); 
        }
        
        const T& front()const 
        { 
            return _c.front(); 
        }

        size_t size()const 
        { 
            return _c.size(); 
        }

        bool empty()const 
        { 
            return _c.empty(); 
        }
    private:
        Con _c;
    };
}

namespace bit
{
    template <class T, class Sequence = vector<T>, class Compare = less<T> >
    class priority_queue
    {
    public:
        priority_queue() : c()
        {}

        template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last)
            : c(first, last)
        {
            make_heap(c.begin(), c.end(), comp);
        }

        bool empty() const 
        { 
            return c.empty(); 
        }

        size_t size() const 
        { 
            return c.size(); 
        }

        T& top() const 
        { 
            return c.front(); 
        }

        void push(const T & x)
        {
            c.push_back(x);
            push_heap(c.begin(), c.end(), comp);
        }

        void pop() {
            pop_heap(c.begin(), c.end(), comp);
            c.pop_back();
        }
    private:
        Sequence c;
        Compare comp;
    };
}

スタックとキューの下部のデフォルトコンテナーとしてdequeを選択する理由

スタックは後入れ先出しの特別な線形データ構造です。これは、push_back()およびpop_back()操作を含む線形構造がスタックの最下部のコンテナーとして使用できる限り(ベクトルやリストなど)、キューは先入れ先出し特別です線形データ構造は、線形構造にpush_backおよびpop_front操作がある限り、リストなどのキューの基になるコンテナーとして使用できます。ただし、STLでは、主に次の理由により、デフォルトでスタックとキューの基になるコンテナーとしてdequeが選択されています。

  1. スタックとキューをトラバースする必要はありません(したがって、スタックとキューにはイテレーターがありません)。固定端または両端でのみ動作する必要があります。
  2. スタック内の要素が大きくなると、両端キューはベクトルよりも効率的になり、キュー内の要素が大きくなると、両端両端キューは効率的であるだけでなく、メモリ使用量も多くなります。

文をまとめると、両端の両端が最速で成長し、削除されます。

主なポイントの要約:

スタック キュー
デフォルトのアダプター
オプションのアダプター ベクトル、リスト リスト
作動する必要があります push => push_back、pop => pop_back、top =>戻る push => push_back、pop => pop_front、back => back、front => front

priority_queue:

#include(模倣関数)
デフォルトのアダプター:ベクトルの
デフォルトの比較方法:少ない

オプションのアダプター:deque
オプションの比較方法:大きい

#include(アルゴリズム)

构造=> make_heap
push => push_back + push_heap
pop => pop_front + pop_heap
top =>フロント

Functor:関数呼び出し演算子( "()")をオーバーロードすることによって関数として使用できるクラス


別の意見がある場合は、メッセージを残して議論してください!

元の記事を152件公開 賞賛されている45件 10,000回以上の閲覧

おすすめ

転載: blog.csdn.net/AngelDg/article/details/105334941