STLアダプタadapter

14385 ワード

文書ディレクトリ
  • 前言
  • 一.関数アダプタbind 1 nd、bind 2 nd
  • 二.容器アダプタ
  • 前言
    私达は日常生活の中でコンピュータに充电しなければならなくて、コンピュータの时直接强大な电圧に耐えることができなくて、だから私达は1つのアダプタを使って电圧を変换して、私达のコンピュータにアダプタを通じて充电することができます.C++STLでは、すでに規定されているテンプレートを使用したいのですが、このテンプレートはいくつかの変換をして使用する必要があります.これにより、アダプタが登場します.以下主に
  • 関数アダプタbind 1 nd、bind 2 nd
  • コンテナアダプタstack,queue,priority_queue

  • 一.関数アダプタbind 1 nd、bind 2 nd
    ある関数を使用したい場合、この関数が私たちの使用要件に完全に合致していない場合は、関数アダプタbind 1 st,bind 2 ndを使用して、私たちが使用したい関数を返す必要があります.
    またbindの使い方が多すぎて、別の文章を参考にします:bind関数アダプタ、bindコールバックを利用して継承のないマルチステートを実現して、men_fnメンバー関数を関数オブジェクトに変換する
    struct pred:public binary_function<int, int, bool>{
        bool operator()(const int& lhs, const int& rhs)const{
            if (lhs >= rhs){
                cout << lhs << endl;
                return true;
            }
            return false;
        }    
    };
    
    //  , vector   >=5 ,      
    void test1(){
        vector<int> vec{1,3,5,6,7,8};
        for_each(vec.begin(), vec.end(), bind2nd(pred(), 5));    
    }
    
    //  ,  vector >=5   
    void test2(){
        vector<int> vec{1,3,5,6,7,8};
        vec.erase(remove_if(vec.begin(), vec.end(), bind2nd(std::greater_equal<int>(), 5)), vec.end());
        for (auto& e : vec)
            cout << e << endl;
    }
    

    二.容器アダプタ
    stack、queue、priority_queueはいずれもコンテナアダプタstackとqueueの標準テンプレートがdequeであり、stackとqueueは実装されたdequeの一部の機能に相当し、関数を書き直す必要がないため、コンテナアダプタpriority_Queueの標準テンプレートはvectorであるが,優先キューの論理実装は最大スタック,最小スタックと一致し,下位層は依然として二叉スタックで実現される.
    class Point{
    public:
        Point(int x, int y)
        :_x(x)
        ,_y(y)
        {
            _sum = x + y;
        }
        int _x;
        int _y;
        int _sum;
        friend ostream& operator<<(ostream& os, const Point& lhs);
        
    };
    ostream& operator<<(ostream& os, const Point& lhs){
        os << lhs._sum;
        return os;
    }
    
    struct myCompare{
        bool operator()(const Point& lhs, const Point& rhs){
            return lhs._sum > rhs._sum;
        }
    };
    
    void test3(){
        priority_queue<Point, vector<Point>, myCompare> myque;
        myque.push(Point(1,1));
        myque.push(Point(2,2));
        myque.push(Point(3,3));
    
        while (!myque.empty()){
            cout << "Now the highest priority is :" << myque.top() << endl;
            myque.pop();
        }
    }
    
    int main(){
        test3();
        return 0;
    }