微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 运算符<比较多个字段

我有以下运算符<这应该首先按值排序,然后再按另一个值排序:
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 :: field1的值相等,则应该仅比较Obj :: field2的值.

易于理解的方式:

/* 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;

正确(推荐)方式:

实施它的“正确”方式仅使用操作符<要比较这些领域,下面看起来比实际更复杂. 然而,它将产生与之前编写的易于理解的示例相同的结果.

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

必须有一种实现运算符的方法,没有引起很多头痛?

C 11

您可以使用STL中的std :: tuple,该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方法不会导致太多的开销,实现起来很简单.

> Implementing comparision operators via ‘tuple’ and ‘tie’,a good idea?

原文地址:https://www.jb51.cc/c/114812.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐