0

我有时想在 map 和 set 中使用包含多个值的键。我不太在意速度。是否有一种简单或通用的方法来编写 operator < 来比较具有多个值的结构?我自己想出了以下内容,但这很乏味,尤其是随着值数量的增加。谢谢。

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

您可以尝试将它们转换为元组,然后它们进行比较。那将取代你的Properties班级。

于 2013-03-13T12:27:26.753 回答
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 回答