monolakeのGeekBand C++開発学習ノート(七)

3315 ワード

前記:STLの2週目に入り、今週はstlコンテナ:stack、queue、mapとmultimap、setとmultisetについて説明し続けました.STLの全体構成フレームワーク:コンテナ、アルゴリズム、反復器、シミュレーション関数間の関係;シミュレーション関数とアダプタ;典型的なアダプタ:binder 1 st,binder 2 nd,mem_fun,mem_fun_ref. 以下は私の理解です.
コンテナ分類
コンテナには、次の基本的な2種類があります.
1,シーケンスコンテナ(Sequence containers)
各要素に固定された位置を持つシーケンス可能なクラスタ.位置は、要素の値に関係なく、挿入タイミングと場所によって関係します.STLで定義されたシーケンスコンテナ:vectror,deque,list.
2,アソシエーションコンテナ(Associative containers)
特定のソート基準に応じて、エレメントの場所によって順序付けされたクラスタ.挿入タイミング(順序)に関係なく、要素値に依存する.STLが提供する関連コンテナ:set,multiset,map,multimap.
その他:コンテナアダプタ(Container Adapters)
以上の2種類の基本的な容器に加えて、基本容器に適合するために使用される一連の容器がある:1,Stacks、要素に対してLIFO(後進先出)の管理戦略をとる.2,Queues、要素に対してFIFO(先進先出)の管理戦略をとる.3,Priority Queues、優先権管理の戦略を自己定義する.
findアルゴリズム
findアルゴリズムは、その名の通りアルゴリズムを検索し、ターゲット値を検索し、最初の値の位置反復器を返します.異なるコンテナにはfindアルゴリズム関数が2つあります.
1,非メンバーfind関数
非メンバー関数findは線形時間の複雑さであり、あなたが彼に伝えた区間内の要素を1つずつ遍歴し、等号(=)演算子で等しかったかどうかを判断します.そのため、このfind関数を使用するには、コンテナに含まれるタイプに==コンパレータが必要です.
2,メンバーfind関数
セットなどの関連コンテナのメンバー関数findはlogn時間の複雑さであり、彼はset内部のデータ構造(一般的には赤と黒の木)を利用して要素を探して、set内部の比較器に基づいて、もしあなたが明示的に彼に比較器をあげなければ、デフォルトは小さい番号です(setのデフォルトのソート方式は模倣関数less<>を使っていることを知っているので、これ自体は小さい番号です(ただし、カスタムソートのsetは?次の例を参照してください.
#include
#include
#include
#include
#include

using namespace std;

struct Programmer
{
    Programmer(const int id, const wstring name) :Id(id), Name(name) {};
    void Print()const
    {
        wcout << L"[" << Id << L"]:"<< Name << endl;
    }
    int Id;
    wstring Name;
    const wstring& GetName()const { return Name; };
    const int GetId()const { return Id; };
    void SetName(const wstring& name) { Name = name; };
};


struct ProgrammerIdGreater:public binary_function
{
    bool operator()(const Programmer& p1, const Programmer& p2)const 
    {
        return(p1.GetId() < p2.GetId()) ? false : true;
    }
};

int main()
{
const int SIZE = 6;
    const Programmer progArray[SIZE] =
    {
        Programmer(1,L"Scott Mayers"),
        Programmer(2,L"Martin Folwer"),
        Programmer(3,L"Bill Gates"),
        Programmer(4,L"P.J.Plaught"),
        Programmer(5,L"Stanly B.Lippman"),
        Programmer(6,L"Andrei Alexandrescu")
    };
    set
        set1(progArray, progArray + SIZE);
}

例ではソート方法をカスタマイズし,set 1をIDの逆順序で並べ替えた.私の文に注意してください.
return(p1.GetId() < p2.GetId()) ? false : true;


前false、後ろtrueを使用します.すなわち、比較<0の戻りfalseを用い、比較>0はtrueを返す.等価と是用の>比較.findを呼び出すと
set::iterator it1 = set1.find(Programmer(3, L"Bill Gates"));

実行結果の直接エラー:invalid comparator..説明findでは、デフォルトの使用>比較器はサポートされていません.operatorを再ロードします
bool operator 

再実行はやはり:invalid comparator、答えもだめです.説明findメンバー関数は、このoperatorを使用しないで、上記のsetソートを
return(p1.GetId() > p2.GetId()) ? true : false;

運行、やっぱり成功しました.(説明逆順配列を使用しているので、内部の0時false)findメンバー関数の比較器が本当に筋であることを説明し、setのソートルールで使用されているソート器を認識し、
PS:以上のテスト環境:win 7×86,vs2015.