c++ - operator< 比较多个字段

标签 c++ comparison-operators lexicographic

我有以下运算符<,它应该首先按一个值排序,然后按另一个值排序:

    inline bool operator < (const obj& a, const obj& b) 
    {
        if(a.field1< b.field1)
            return true;
        else
            return a.field2 < b.field2;
    }

我觉得这是不正确的,如果不对成员变量进行第三次比较测试就无法做到这一点,但我找不到任何这不起作用的示例。 那么这真的符合预期吗? 谢谢

编辑: 我会将其编码为:

    inline bool operator < (const obj& a, const obj& b) 
    {
        if(a.field1< b.field1)
            return true;
                    else if(a.field1> b.field1)
            return false;
        else
            return a.field2 < b.field2;
    }

有什么区别吗?我问是因为我知道我的经验是正确的,但也比第一个长

最佳答案

我想自己做这一切..

您应该只比较 Obj::field2 的值如果 Obj::field1 的值是平等的。

通俗易懂的方式:

/* This will meet the requirements of Strict-Weak-Ordering */

if (a.field1 != b.field1) return a.field1 < b.field1;
else                      return a.field2 < b.field2;

正确(推荐)方式:

实现它的“正确”方法仅使用 operator<比较字段,下面看起来比实际更复杂。

然而,它会产生与之前编写的易于理解示例相同的结果。

return a.field1 < b.field1 || (
  !(b.field1 < a.field1) && a.field2 < b.field2
);

必须有一种方法来实现operator<不会引起很多头痛?

C++11

您可以使用 std::tuple来自已经有 operator<STL对于定义的多个字段,例如下面的示例。

#include <utility>

...

inline bool
operator< (Obj const& lhs, Obj const& rhs)
{
  return std::tie (lhs.field1, lhs.field2) < std::tie (rhs.field1, rhs.field);
}

C++03

如果您的编译器还不支持 C++11,而您只需要比较每个对象的两个字段,您可以使用 std::pair相反。

std::make_pair的原因与前面使用 std::tie 的示例相同.

#include <utility>

...

inline bool
operator< (Obj const& lhs, Obj const& rhs)
{
  return std::make_pair (lhs.field1, lhs.field2)
       < std::make_pair (rhs.field1, rhs.field2);
}

使用 std::pair将需要创建成员的拷贝,这在某些情况下是不可取的。

这真的是推荐的做法吗?

有关更多信息,请参阅以下问题/答案,但要总结一下; c++11 方法不会造成太多开销,而且实现起来非常简单。

关于c++ - operator< 比较多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393542/

相关文章:

c++ - 使用 OpenCV C++ 交换 RGB channel 颜色

c++ - 如何定义静态常量成员?

javascript - 在 JavaScript 中创建 deepEqual 函数

python - Pandas 如何处理类型为 "object"的列与整数进行比较的情况?

c++ - 返回值优化问题

python - Python 是否定义了 "NaN > 0"的值?

c++ - 字符串的字典序比较[不区分大小写]

python - 将相同的字典顺序分配给二维数组的重复元素

java - 按字典顺序比较两个字符串

c++ - 友元类之间访问函数变量