Написание оператора <() для структуры кажется более понятным, чем написание классического сравнения с тремя значениями.</p>
например, для сортировки следующих
struct S {
int val;
};
вы можете написать оператор <</strong> ()
bool operator< ( const S &l, const S &r ) {
return l.val < r.val;
}
или a trivalue function ( обычно следующим образом )
int compare( const S &l, const S &r ) {
if( r.val > l.val ) return 1;
if( r.val < l.val ) return -1;
return 0;
}
Первый вариант более понятен, поэтому можно сказать, что качество кода лучше.Последнее заставляет задуматься о 3 случаях, что усложняет код.
Но эта мысль немного обманчива в более сложных структурах:
struct S {
int x;
int y;
};
следующее ясно, и начинающие склоннынапишите это так
bool operator< ( const S &l, const S &r ) {
if( l.x < r.x ) return true;
if( l.y < r.y ) return true;
return false;
}
но это неправильно !Вы не можете правильно сортировать это!
И нужно некоторое время, чтобы подумать, что вам действительно нужно написать это так, чтобы
bool operator< ( const S &l, const S &r ) {
if( l.x < r.x ) return true;
if( l.x > r.x ) return false;
if( l.y < r.y ) return true;
if( l.y > r.y ) return false;
return false;
}
работало правильно.
Можете ли вы, и вы написать такую функцию сравнения лучше или яснее? Старая функция сравнения трех значений по крайней мере "заставила" задуматься о>, <и == случаи.</p>