我有以下运算符<这应该首先按值排序,然后再按另一个值排序:
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?