Войти
ПрограммированиеФорумОбщее

Как правильно написать operator < в C++ (комментарии)

Страницы: 1 2 37 8 Следующая »
#0
2:13, 20 дек. 2011

Как правильно написать operator < в C++ (комментарии)

Это сообщение сгенерировано автоматически.


#1
2:13, 20 дек. 2011
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'ов из функции

В остальном понравилось

ОПА! Сам морознул!
Не буду стирать, оставлю ка напоминалку о необходимости изредка кодить на плюсах

#2
2:47, 20 дек. 2011
    if (a < other.a)
      return true;
    
    if (other.a < a)
      return false;
Изображение удалено
#3
3:06, 20 дек. 2011

Даа...
Мастер-класс программирования!!

#4
10:49, 20 дек. 2011

Igor'
> if (a < other.a)
> return true;
>
> if (other.a < a)
> return false;
> FUUU
А что не так? Для интов, может, и не очень изящно, но если там не инты, а другие компарабельные классы, у которых определён только оператор <, то логика именно такая.

#5
10:57, 20 дек. 2011

Sbtrn. Devil

> у которых определён только оператор <, то логика именно такая.
Если (a < other.a) == false, то (other.a < a) == true. Если нет, то для достижения нужного эффекта проще не париться с классами и операторами сравнения, а просто написать

#define true false

#6
11:05, 20 дек. 2011

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;
}
#7
11:06, 20 дек. 2011

Ghost2
> Если (a < other.a) == false, то (other.a < a) == true
Равенство все таки очень важно.

#8
11:10, 20 дек. 2011

Z

> Равенство все таки очень важно.
Да, затупил.

#9
13:53, 20 дек. 2011

Эта тема уже поднималась.

http://www.gamedev.ru/code/forum/?id=155803

#10
13:57, 20 дек. 2011

dave
Ето явно подходящий вопрос для собеседований, раз столько програмистов его заваливают на ура.

#11
14:38, 20 дек. 2011

Z
> if( a.x != b.x ) return a.x < b.x;
А оператора (не)равенства в классе может не быть, он определяется через (!(a<b) && !(b<a)).

#12
14:51, 20 дек. 2011

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;
А для простъх типов как я написал.
#13
15:10, 20 дек. 2011

Z

Канонический оператор меньше:

return (a.x < b.x || !(b.x < a.x) && a.y < b.y)

#14
15:44, 20 дек. 2011

eagle
Разумеется последнее сравнение последнего поля всегда лишнее, я написал лиш фрагмент оператора, вот и.

Страницы: 1 2 37 8 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.