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