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

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

Страницы: 1 2 3 4 58 Следующая »
#30
16:48, 21 дек. 2011

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

Логически

    if (a < other.a)
      return true;
    
    if (other.a < a)
      return false;
[/code[

и

[code=cpp]
if(a < other.a) return true;
else return false;

это одно и тоже, внимание вопрос, НАХРЕНА лишний оператор в коде?


#31
16:53, 21 дек. 2011

RPGman
> На что имеем:
> Foo = {1,2,3};
> Bar = {1,3,1};
> И имеем Foo<Bar = false, т.к. видите-ли третье поле у foo не меньше третьего у
> bar, и пофиг, что старшие разряды меньше. "Я так писать буду!" :)
С вариантом из статьи фейл будет на
Foo = {1,1000000,10000};
Bar = {2,0,0};
Foo<Bar=true....

Безотказный вариант:

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

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

Igor'
> это одно и тоже, внимание вопрос, НАХРЕНА лишний оператор в коде?
У... как всё печально. Даже такой кусок кода надо снабжать комментариями :)

    if (a < other.a)
      return true;   // сработает, если a меньше other.a
    
    if (other.a < a)
      return false;  // сработает, если a больше other.a

    // а сюда управление перейдёт, если a равно other.a
#33
16:59, 21 дек. 2011

Igor'
> if(a < other.a) return true;
> else return false;
> это одно и тоже, внимание вопрос, НАХРЕНА лишний оператор в коде?
Это нихрена не одно и то же. Т.к. сравниваемых полей много, то равенство старших полей еще не означает, что объект не меньше. Он все еще может быть меньше в младших полях.

>С вариантом из статьи фейл будет на
>Foo = {1,1000000,10000};
>Bar = {2,0,0};
>Foo<Bar=true....
И где фейл? Старшее поле меньше, чем у другого. Всё, Foo меньше.
Ты-ж не сумму полей сравниваешь, а делаешь lexicographical сравнение по всем полям.

#34
17:03, 21 дек. 2011

Igor'
> Безотказный вариант
> int compare = 0;
> compare += (a < other.a);
> compare += (b < other.b);
> compare += (s < other.s);
> return compare > 1;

ABS foo, bar;
foo.a = 0; bar.a = 1;
foo.b = 0; bar.b = 0;
foo.s = 0; bar.s = -1;

bool isFooLessBar = foo < bar; // true
bool isBarLessFoo = bar < foo; // true

// логично дальше некуда, ага

Правка: а, стоп. В конце ты сравниваешь не с нулём, а с единицей.
То есть, как минимум, два поля должны быть меньше, чтобы объект был меньше.
Ну, так, в принципе, нормально. Если, конечно, требовалось такое поведение.

#35
17:08, 21 дек. 2011

RPGman
> Ты-ж не сумму полей сравниваешь
я сумму )

Alprog
> if (a < other.a)
> return true; // сработает, если a меньше other.a
>
> if (other.a < a)
> return false; // сработает, если a больше other.a
Изображение удалено
У нас не оператор <>, у нас оператор <, if(a < other.a) если true выходим из тела оператора возвращая true иначе переходем на сравнее следующего поля с помощью оператора <, зачем нам два оператора в одном?? получаеться у нас оператор < и > сразу в одном операторе <.
Ну кароче вас, дураки вы и уши у вас холодные (:

#36
17:11, 21 дек. 2011

Igor'
> я сумму )
Так и пиши тогда a+b+c < other.a+other.b+other.c, а не городи огород из сравнений.

#37
17:15, 21 дек. 2011

Igor'
> Ну кароче вас, дураки вы и уши у вас холодные (:
Изображение

#38
17:18, 21 дек. 2011

Я глянул только начало статьи. И собирался написать, что, мол, ud1, конечно, молодец,
но на фиг это никому не надо; потому что уж коль человек операторы умеет перегружать, то
логику больше-меньше ему объяснять не надо. Но теперь понял, что оказался не прав. Статья нужная :D

Igor'
> зачем нам два оператора в одном??
Потому что младшие поля можно трогать, только если старшие равны.
Иначе получится, что a < b, а b < a. А если ты также реализуешь
оператор >, то ещё получится, что a > b, и b > a.

#39
17:30, 21 дек. 2011

RPGman, лан ступил с проверкой не суммы, каюсь, был не прав, прошу не карать.
если всё учесть, то что было тобой сказано, то получаеться же вот так:

if(a > other.a) return false;
if(b > other.b) {
 if(s < other.s) return true;
 else return false;
}
return true;

#40
17:38, 21 дек. 2011

Igor'
> вроде, должно всё правильно быть...
> bool c1 = a <other.a;
> if(!c1) return false;
Неправильно. Если а не меньше other.a, это еще не значит, что весь объект не меньше.

#41
17:45, 21 дек. 2011

Igor'
> if(a > other.a) return false;
> if(b > other.b) {
> if(s < other.s) return true;
> else return false;
> }
> return true;
И так неправильно.
Если a равны, и b равны, то у тебя foo<bar и одновременно bar<foo.

#42
17:50, 21 дек. 2011

RPGman
> И так неправильно.
> Если a равны, и b равны, то у тебя foo<bar и одновременно bar<foo.
Да там всё сложнее, ветвлений будет больше, но то что в статье точно-также будет фейлить...

#43
18:02, 21 дек. 2011

Igor'
> но то что в статье точно-также будет фейлить...
В статье указан абсолютно корректный вариант.
Ну, или найди случай, когда оно по-твоему неправильно, и обоснуй.

#44
18:14, 21 дек. 2011

Igor'
> надо
Надо дальше учится!

Alprog
> но на фиг это никому не надо; потому что уж коль человек операторы умеет
> перегружать, то
> логику больше-меньше ему объяснять не надо. Но теперь понял, что оказался не
> прав. Статья нужная :D
Удивишся. Колегги со стажем в 4-5 лет не смогли етот оператор написать с первого раза! Написали вон как Igor'.

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

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