// set の使用例
// 関数オブジェクト(function object)を自作してみます
// (*)関数オブジェクト: operator()関数を持つオブジェクト
//                      unary_function, または binary_function を継承する

#include <iostream>
#include <string>
#include <set>
#include <functional>

using namespace std ;

class myclass {
public:
    string szName;
    myclass() {} ;
    myclass ( const string& name ) {
        szName = name ;
    }
} ;

// 比較クラス用に関数オブジェクトを定義
struct lessMyClass : binary_function< myclass, myclass, bool> {
	bool operator( )( const myclass& ob1, const myclass& ob2 ) const {
		return ob1.szName < ob2.szName;
	}
};


typedef	set<myclass, lessMyClass>	SetMyClass;

int main ()
{
	SetMyClass setmyclass ;

    setmyclass.insert( myclass("spinel") );
    setmyclass.insert( myclass("pyrite") );
    setmyclass.insert( myclass("calcite") );

    for ( SetMyClass::iterator itr = setmyclass.begin () ; itr != setmyclass.end () ; itr++ ) {
        cout << itr->szName << endl;
    }

    return 0 ;

}

/*
	set00.cpp のソースと比較して、分かり易いと思います。
	set00.cpp では functional の less までもぐって、演算子をオーバーロード
	するイメージでしたが、本ソースは、setのコンストラクタで、
	比較用の自作関数オブジェクトを指定するだけでOKです。
	「比較はこの関数オブジェクトに任せる」。分かり易いです。
*/


// end of file