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

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

Страницы: 1 2 3 48 Следующая »
#15
16:17, 20 дек. 2011
bool operator<(const Test& other) const
{
  if(a == other.a)
  {
    if(b == other.b)
    {
      return s < other.s;
    }
    else
      return b < other.b;
  }
  else
    return a < other.a;
}

#16
16:23, 20 дек. 2011

bool operator<(const Test& other) const
{
  if(a != other.a) return a < other.a;
  if(b != other.b) return b < other.b;
  return a < other.a;
}

#17
16:30, 20 дек. 2011

Не стоит постить не универсальный вариант с ==/!=/>.
Оператор < нужно определять только через < в целях универсализации.

Конечно, можно использовать не универсальный вариант на конкретном примере, но в данных примерах типы a и b не известны, поэтому приводить частные случаи с == и тд - нельзя. Ну и это нарушает принцип обобщенности кода.

По правилам использования map - элементы обязаны иметь оператор <, а все остальные операторы - не обязаны.

#18
17:46, 20 дек. 2011

laMer007
> не обязаны
Так компилятор ведь отругает, вот и поправиш.

#19
18:43, 20 дек. 2011

Z
> Так компилятор ведь отругает, вот и поправиш.
Человек то писал эту статью, чтобы бедных юнцов компилятор не ругал и map работал.

#20
19:27, 20 дек. 2011

  С++ в конец дошёл до ручки.  Или программисты. Дальше уже некуда. Я мог бы предположить, что позже будут объяснять как определять оператор сложения, но это всё-таки сложнее, поэтому до него, наверное, дело не дойдёт :)

#21
19:30, 20 дек. 2011

Zefick
> С++ в конец дошёл до ручки.
А С++ то тут причём? Как будто в Java лучше? Все беды в головах.

#22
1:30, 21 дек. 2011

лучше всего показать вначале пример из моего поста http://www.gamedev.ru/code/forum/?id=155803&page=2#m24
с ссылкой на вики.

#23
15:05, 21 дек. 2011

laMer007
> Оператор < нужно определять только через < в целях универсализации.
В целях совместимости с языком Brainf**k :)

#24
15:49, 21 дек. 2011

Каждый пишет в меру своей испорчености, я бы написал так:

if(a < other.a && b < other.b && s < other.s) return true;
return false;
Ибо оператор у нас <, зачем проверять на равенство, это вобще роли не сыграет...

#25
16:00, 21 дек. 2011

Igor'
> Каждый пишет в меру своей испорчености, я бы написал так:
Статья для таких, как вы.

#26
16:05, 21 дек. 2011

Chipmunk
> Статья для таких, как вы.
Помоему статья - просто троллинг :), вот где логика в этом куске кода?

    if (a < other.a)
      return true;
    
    if (other.a < a)
      return false;
зачем?? или может автор про
else
не знает? да и если уж на то пошло v1.a может и будет меньше v2.a но не факт что v1.b, v1.s будут меньше v2.b, v2.s, тоесть на первой же праверке фейл нам уже обеспечен...


Давайте уж тогда так, чтоб вобще железно:

int compare = 0;
compare += (a < other.a);
compare += (b < other.b);
compare += (s < other.s);
return compare > 1;

#27
16:27, 21 дек. 2011

Igor'
>вот где логика в этом куске кода?
Логика там железная. Если первое поле меньше такого-же у другого объекта, то этот первый гарантированно меньше.
А если у другого объекта первое поле меньше, то первый объект уже гарантированно не меньше.

> зачем?? или может автор про else не знает?
А зачем тут else? Для лишней пары скобок и дополнительного отступа для всех остальных проверок?

#28
16:32, 21 дек. 2011

RPGman
Молодежь не понимает зачем это все нужно писать правильно, если можно реализовать оператор < как захотелось левой пятке. (Не все из них знают, что map не будет правильно работать, если это сделать не верно).

#29
16:37, 21 дек. 2011

Igor'
> Каждый пишет в меру своей испорчености, я бы написал так:
> if(a < other.a && b < other.b && s < other.s) return true;
На что имеем:
Foo = {1,2,3};
Bar = {1,3,1};
И имеем Foo<Bar = false, т.к. видите-ли третье поле у foo не меньше третьего у bar, и пофиг, что старшие разряды меньше. "Я так писать буду!" :)

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

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