オブジェクトの順序

オレオレクラスのオブジェクトを STL のコンテナに詰めたい。

vector になら詰められるけど、set に詰めようと思ったら、オブジェクトの順序を決めないといけない。

operator< さえあればオブジェクトの順序は決まるみたい。

class Foo
{
        ...
public:
	bool operator<(const Foo& rhs) const { return id < rhs.id; }
    ...

これで set に詰めても怒られない。

#include <set>
    ...
    set<Foo> foo;
    foo.insert(Foo(1));
    foo.insert(Foo(2));
    ...

operator< は、カプセル化を崩さないなら、メンバ関数にしない方がいいらしい。

class Foo
{
        ...
public:
	int id() const;  // 判断材料が公開されているなら ...
    ...
};

bool operator<(const Foo& lhs, const Foo& rhs)
{
	return lhs.id() < rhs.id();
}

こうすると < の右辺でも左辺でも暗黙の型変換をしてくれる。*1

<=, >=, > は < から自動生成するらしい。

順序とは関係ないけど、!= は == から自動生成するらしい。

#include <utility>
    ...
using namespace std::rel_ops;
    ...
    Foo f1(1);
    Foo f2(2);
    if (f1 >= f2)
        ...

*1:コンストラクタが explicit でなければ