// set の使用例。 自作クラスをsetに格納する
// デフォルトの less 関数オブジェクトを使用する


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

using namespace std ;

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


// functional中の less<class T>() の演算子"<"を定義する必要あり
bool operator<( const myclass& ob1, const myclass& ob2 ) 
{
    return ob1.szName < ob2.szName;
}

// 第2引数は不要ですが、敢えて..(明示するために)
typedef  set< myclass, less<myclass> > 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 ;
}

/*
	ちゃんと文字列を昇順に並べ替えてくれています。
	自作クラスをsetに格納したい場合は、最低でも演算子"<" を
	オーバーロードする必要があります。
	set のソースを見れば 比較用のクラスにデフォルトで less を
	使用していることが分かります。だから "<"だけでもオーバーロード
	しなくてはいけません(しなければコンパイルエラーです)。
*/

// end of file