0

複数の値を含むマップとセットでキーを使用したい場合があります。速度はあまり気にしません。演算子 < を記述して構造体を複数の値と比較する簡単または一般的な方法はありますか? 私は自分で次のことを考え出しましたが、特に値の数が増えると面倒です。ありがとう。

struct Properties
{
    Properties() {}

    Properties
        ( const string& data1
        , const string& data2
        , const string& data3
        )
        : data1(data1)
        , data2(data2)
        , data3(data3)
    {}

    string data1;
    string data2;
    string data3;

    bool operator < (const Properties& other) const
    {
        if (this->data1 == other.data1)
        {
            if (this->data2 == other.data2)
            {
                if (this->data3 == other.data3)
                {
                    return false;
                }
                else
                {
                    return this->data3 < other.data3;
                }
            }
            else
            {
                return this->data2 < other.data2;
            }
        }
        else
        {
            return this->data1 < other.data1;
        }
    }
};
4

5 に答える 5

4

これに使用できますstd::tie

#include <tuple>

bool operator<(Properties S& rhs) const
{
  return std::tie(data1, data2, data3) < std::tie(rhs.data1, rhs.data2, rhs.data3);
}

これは、 のタイプに関係なく機能しdataNます ( がある場合operator<)。

于 2013-03-13T12:29:48.713 に答える
1

それはかなり退屈になります。

もちろん、データを配列に格納する場合 [すべてのデータが同じ型であると仮定して]、ループを使用できます。

const int numstrings = 3;
string data[3];

...

bool operator < (const Properties& other) const
{
   for(int i = 0; i < 3; i++)
   {
      if (data[i] != other.data[i])
      {
          return data[i] < other.data[i]; 
      }
   }
 }

もちろん、既存のコードを少し短くすることもできます。

bool operator < (const Properties& other) const
{
    if (this->data1 != other.data1)
    {
        return this->data1 < other.data1;
    }
    if (this->data2 != other.data2)
    {
        return this->data2 < other.data2;
    }
    return this->data3 < other.data3;
}
于 2013-03-13T12:30:55.847 に答える
0

これを行う従来の方法は次のとおりです

bool operator<(Properties const& lhs, Properties const& rhs) const
{
    return (lhs.data1 < rhs.data1)
           || (!(rhs.data1 < lhs.data1) && lhs.data2 < rhs.data2)
           || (!(rhs.data1 < lhs.data1) && !(rhs.data2 < lhs.data2) && lhs.data3 < rhs.data3;
}

operator<これには、に依存するのではなく、定義されたすべてのタイプで機能するという利点がありoperator==ます。

于 2013-03-13T12:35:00.187 に答える
0

次のように、よりフラットな方法でそれを行うことができます。

bool operator < (const Properties& other) const
{
    if (this->data1 < other.data1)
        return true;
    if (other.data1 < this->data1)
        return false;

    if (this->data2 < other.data2)
        return true;
    if (other.data2 < this->data2)
        return false;

    return this->data3 < other.data3;
}
于 2013-03-13T12:32:00.153 に答える
0

それらをタプルに変換しようとすると、それらが比較されます。Propertiesそれはあなたのクラスを置き換えるでしょう。

于 2013-03-13T12:27:26.753 に答える