c++ - 运算符<比较多个字段

标签 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++ - 运算符<比较多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312448/

相关文章:

c++ - 使用指针和引用,搞不懂为什么DFS会无限循环

python - Python 中的链式比较实际上是如何工作的?

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

python - 创建一个程序,如果按字典顺序输入三个单词则打印 true

java - Java 中的字典顺序

c++ - 函数指针表达式

c++ - C++中正态分布的随机数

c++ - Clang 无法在 macOS 中编译基本头文件(如 <iostream>)

javascript - 你能覆盖 == 在 Javascript 中的作用吗?

Java - 按字典顺序查找下一个单词