オブジェクトの順序
オレオレクラスのオブジェクトを 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) ...