何が最も簡単な方法を定義する際の字句との比較のための要素のクラス?
-
21-09-2019 - |
質問
している場合はクラスがこういうことができるように並べ替え(ieの支援が少なコンセプト)、複数のデータ項目がない際の字句順序付けしていて思ったこと。
struct MyData {
string surname;
string forename;
bool operator<(const MyData& other) const {
return surname < other.surname || (surname==other.surname && forename < other.forename); }
};
このなかに十分のためにも2つ以上のデータを会員とする。ある単純な方法の実現です。のデータがあるときは他の同クラスです。
解決 2
の登場とともにC++11にある、新しい簡潔な方法を用 std::タイ:
bool operator<(const MyData& other) const {
return std::tie(surname, forename) < std::tie(other.surname, other.forename);
}
他のヒント
tuple
は良いアイデアですが、あなたはメンバ変数の名前を持っておきたい場合は、それがこのような再構築あなたの比較関数に十分良いかもしれません。
struct MyData {
string surname;
string forename;
string var;
// ...
bool operator<(const MyData& other) const {
if (surname != other.surname) return surname < other.surname;
if (forename != other.forename) return forename < other.forename;
if (var != other.var) return var < other.var;
// ...
return false; //< They are equal
}
};
あなたの好みに応じて、あなたも#define COMPARE(field) if (field != other.field) return field < other.field;
のようなマクロは重複を減らしたいかもしれません。次に、関数は、ちょうどCOMPARE
-呼び出しのリストになるでしょう。
あなたは辞書式の比較を提供boost::tuple
、にデータを格納し、名前のアクセサ関数を提供、の線に沿って可能性があります:
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
struct Data {
string &surname() {return stuff.get<0>();}
string &forename() {return stuff.get<1>();}
// it would be polite to add const overloads too.
bool operator<(const Data &other) const {return stuff < other.stuff;}
private:
boost::tuple<string, string> stuff;
};
私は、これがまたstd::tr1::tuple
として入手可能であり、今後の標準でstd::tuple
だろうと考えています。
アクセサのリストを維持することは、おそらく比較コードを維持するよりも管理しやすくなります。
あなたはstd::vector
でそれらを置くことができます。デフォルトではstd::lexicographical_compare
は、ベクトルを比較するために使用されます。
あなたが使用することができ、A boost::tuple
または内蔵されていlexigraphical比較std::pair
。もちろん欠点は、あなたがタプルにメソッドを関連付けることはできませんです。