Escribir un operador <() para una estructura parece ser más claro que escribir la comparación trivalente clásica.¿Cómo se escribe un operador() o menos que functor más limpio que una función de comparación de trivalo
por ejemplo, para ordenar el siguiente
struct S {
int val;
};
puede escribir un operador <()
bool operator< (const S &l, const S &r) {
return l.val < r.val;
}
o, un función trivalue (generalmente de la siguiente manera)
int compare(const S &l, const S &r) {
if(r.val > l.val) return 1;
if(r.val < l.val) return -1;
return 0;
}
La primera es más clara, por lo tanto, puede decir que hay mejor calidad de código. Esto último le obliga a pensar en 3 casos, lo que complica el código.
Pero este pensamiento es un poco engañoso en estructuras más complejas:
struct S {
int x;
int y;
};
la siguiente es clara, y begginners tienden a escribirlo como tal
bool operator< (const S &l, const S &r) {
if(l.x < r.x) return true;
if(l.y < r.y) return true;
return false;
}
pero es mal! ¡No puedes ordenar correctamente con esto!
Y se necesita algo de tiempo para pensar que que realmente tiene que escribirlo así como
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;
}
para que funcione correctamente.
¿Puede usted, y hacer escribir este tipo de función de comparación de una manera más agradable/más clara? La función de comparación trivalue anterior al menos le "forzó" a pensar en>, < y == casos.
No veo ninguna diferencia entre las dos últimas funciones del operador <. – Donotalo
@Donotalo: luego mira con más cuidado. –
lo tengo. ¡Uf! .. – Donotalo