Как правильно написать operator < в C++ (комментарии)
Это сообщение сгенерировано автоматически.
struct Test { int a, b; // Неправильный оператор bool operator < (const Test &other) const { if ( a < other.a) return true; if ( b < other.b) return true; return false; } };
> неверна, так как если test1.a < test2.a и test1.b > test2.b то test1 < test2 и test2 < test1 оба вернут true, что не удовлетворяет третьему условию.
Ну шо тут скажешь - Ынтересный у Вас компилятор ;)
Студия выйдет из функции на первом сравнении.
Также я бы пользовал одну переменную для хранения результата и не делал по *цать return'ов из функции
В остальном понравилось
ОПА! Сам морознул!
Не буду стирать, оставлю ка напоминалку о необходимости изредка кодить на плюсах
if (a < other.a) return true; if ( other.a < a) return false;
Даа...
Мастер-класс программирования!!
Igor'
> if (a < other.a)
> return true;
>
> if (other.a < a)
> return false;
> FUUU
А что не так? Для интов, может, и не очень изящно, но если там не инты, а другие компарабельные классы, у которых определён только оператор <, то логика именно такая.
Sbtrn. Devil
> у которых определён только оператор <, то логика именно такая.
Если (a < other.a) == false, то (other.a < a) == true. Если нет, то для достижения нужного эффекта проще не париться с классами и операторами сравнения, а просто написать
#define true false
Sbtrn. Devil
Все верно, просто написано коряво, как в 5-ом классе. Вот как немного получше:
bool operator < ( const SomeStruct & a, const SomeStruct & b ) const
{
if( a.x != b.x ) return a.x < b.x;
if( a.y != b.y ) return a.y < b.y;
return a.z < b.z;
}Ghost2
> Если (a < other.a) == false, то (other.a < a) == true
Равенство все таки очень важно.
Z
> Равенство все таки очень важно.
Да, затупил.
Эта тема уже поднималась.
dave
Ето явно подходящий вопрос для собеседований, раз столько програмистов его заваливают на ура.
Z
> if( a.x != b.x ) return a.x < b.x;
А оператора (не)равенства в классе может не быть, он определяется через (!(a<b) && !(b<a)).
Sbtrn. Devil
Разумеется, когда сравниваем сложнъе типъ, то так нельзя. Тогда скорее:
bool f = a.x < b.x; if( f || b.x < a.x ) return f; f = a.y < b.y; if( f || b.y < a.y ) return f;
А для простъх типов как я написал.
Z
Канонический оператор меньше:
return (a.x < b.x || !( b.x < a.x) && a.y < b.y)
eagle
Разумеется последнее сравнение последнего поля всегда лишнее, я написал лиш фрагмент оператора, вот и.
Тема в архиве.