对于多变量结构,优选实现'<'

fbr*_*eto 6 c++ language-agnostic comparison

最初这可能看起来过于抽象或哲学,但我真的很想知道某人是否有一个令人信服的论据支持一个实现而不是另一个.

鉴于operator<std::pair<T1, T2>,这将是更好地实现:

return x.first < y.first ||
       x.first == y.first && x.second < y.second;
Run Code Online (Sandbox Code Playgroud)

要么:

return x.first < y.first ||
       !(y.first < x.first) && x.second < y.second;
Run Code Online (Sandbox Code Playgroud)

我的理解是这两种实现产生了相同的结果.后者是首选,因为它仅仅是以operator<?为单位定义的?或者假设一个低于可比性的类型也应该是可比性的是否合法?有没有人看到另一个会在一个或另一个之间摇摆你的观点?

当然,任何答案都应该是通用的和可扩展的.那么你会使用哪一个?为什么?是否有不同的实现甚至比上面的更好?

Jam*_*lis 13

假设对于任何类型,如果它不具有可比性,它也是可比较的,这是不合理的,因为一个可以超载operator<而不是过载operator==.

因此,如果您预计必须处理用户定义的类型,则第二种方法更可取.但是,您应该添加一些括号来阐明操作的顺序:

return x.first < y.first ||
       (!(y.first < x.first) && x.second < y.second);
Run Code Online (Sandbox Code Playgroud)