を簡単にあなたのメンバーの辞書式順序を取得するためにタプルを使用することができます。
return std::tie(lhs.i, lhs.f, lhs.c) < std::tie(rhs.i, rhs.f, rhs.c);
これは、すべてのメンバーは、例えば、同等のタイプのものであることが必要ですlhs.i < rhs.i
が理にかなっています。
std::tie
とstd::tuple
はC++ 11でのみ使用できるため、C++ 03では、 Boost.Tupleはboost::tie
を提供します(boost::tuple
はstd::tuple
と同じ順序付けを使用します)。
これはどこに行くべきかについては、operator<
に入れておくことが慣例です(この後は、最初は簡単に注文できるようにtie
を使用しています)。かなり頻繁にこの演算子は友人となりますので、これは次のようになります。あなたがoperator<
の実装はすべてのfoo
のメンバー(またはのために重要で、少なくともそれらをリストする必要があるとして、それは完全に自動化ではありません見ることができるように
class foo {
public:
/* public interface goes here */
// declaration of non-member friend operator
// if it doesn't need to be a friend, this declaration isn't needed
friend
bool operator<(foo const& lhs, foo const& rhs);
private:
T t;
U u;
V v;
};
bool operator<(foo const& lhs, foo const& rhs)
{
// could be boost::tie
return std::tie(lhs.t, lhs.u, lhs.v) < std::tie(rhs.t, rhs.u, rhs.v);
}
順序)、2回。私が恐れるより良い方法はありません。
operator<
を提供する代わりに、foo
のstd::less
を特化することができますが、これはちょっとエキゾチックで、好ましい方法ではありません。
struct foo_ordering {
bool operator()(foo const& lhs, foo const& rhs) const
{
/* implementation as before, but access control/friendship
has to be planned for just like for operator< */
}
};
:まだ意味をなさない順序が
foo
の拡張インタフェースの一部にする場合(例えば、標準的な1なしで理にかなっている、複数の発注があるかもしれません)、そして好ましい方法はファンクタを書くことです
次に、たとえばstd::set<foo, foo_ordering>
。
それはstd::set
またはその他の連想コンテナで使用されている場合の順序を形成するものに関係なく(どちらかoperator<
、std::less<foo>
またはファンクタを通じて)かかることに注意してください(デフォルトの例でstd::set<T>
は順番にでoperator<
を使用していますstd::less<T>
を使用していますデフォルト)、それはいくつかの厳格な基準に従わなければなりません。つまり厳密な弱い順序でなければなりません。しかし、自分自身で順序付けを行うために使用されるすべてのメンバがSW順序を持つ場合、結果として得られる辞書順はSW順序です。
'std :: set :: find'がどのように実装されているのか気になるのはなぜですか?どうやって使うの? –
findの実装は指定されていませんが、厳密な要件が標準で指定されています。たとえば、C++ 11標準では、23.2.4を参照してください。 – juanchopanza
std :: set :: findのデフォルトの大文字と小文字を使用して、使用しているコンパイラの関数にステップインすることができます。 – DumbCoder