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

前端之家收集整理的这篇文章主要介绍了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?

猜你在找的C&C++相关文章