13

ソートできるようにしたい (つまり、「より小さい」という概念をサポートする) クラスがあり、辞書式の順序付けを行う必要があるようないくつかのデータ項目がある場合、次のようなものが必要です。

struct MyData {
  string surname;
  string forename;

  bool operator<(const MyData& other) const {
    return surname < other.surname || (surname==other.surname && forename < other.forename); }
};

これは、データ メンバーが 2 つを超える場合、かなり扱いにくくなります。それを達成する簡単な方法はありますか?データ メンバは、任意の Comparable クラスにすることができます。

4

5 に答える 5

12

C++11 の出現により、std::tieを使用してこれを達成するための新しく簡潔な方法があります。

bool operator<(const MyData& other) const {
  return std::tie(surname, forename) < std::tie(other.surname, other.forename);
}
于 2015-08-25T09:44:30.883 に答える
11

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なります。

于 2010-03-23T14:53:25.870 に答える
6

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

アクセサーのリストを維持する方が、比較コードを維持するよりも管理しやすいでしょう。

于 2010-03-23T14:40:35.927 に答える
3

すべてのメンバーが同じタイプの場合、それらを に入れることができますstd::vector。デフォルトでstd::lexicographical_compareは、ベクトルの比較に使用されます。

于 2010-03-23T14:47:56.053 に答える
2

辞書式比較が組み込まれているboost::tupleorを使用できます。std::pairもちろん、欠点は、メソッドをタプルに関連付けることができないことです。

于 2010-03-23T14:36:11.677 に答える