Будет ли этот класс иметь строгий слабый порядок - PullRequest
9 голосов
/ 18 августа 2011

Скажем, у меня был класс / структура Foo

struct Foo {
    int a, b;
    bool operator< (Foo const& r){
        return a < r.a;
    }
    bool operator== (Foo const& r){
        return a==r.a&&b==r.b;
    }
};
Foo bar = { 5, 1 };
Foo baz = { 5, 2 };

Теперь bar == baz ложно, но также bar < baz и baz < bar.

Обратите внимание, что здесь порядок полностьюигнорирует b, но b является частью отношения равенства.

Ответы [ 3 ]

12 голосов
/ 18 августа 2011

Технически, да, вы заказываете их непосредственно у члена a, что, например, должно подойти.std::set.В основном они ведут себя как целые числа, т.е.если a Однако - плохая идея определять дваоператоры в одном классе, которые подразумевают разные вещи, потому что это может запутать пользователей этого класса.Насколько я знаю, он не будет напрямую ломать любые контейнеры STL, поскольку они используют только один из двух операторов, но меня, конечно, смущает, что вы можете иметь этот случай, где! (Bar В таком случае я бы предпочел предоставить в качестве члена только оператор, более естественный для класса, и сделать другой доступным через автономную структуру, которая можетбыть предоставлен в качестве параметра шаблона для контейнера STL.Для меня это проясняет, что это способ упорядочения экземпляров класса, который не обязательно эквивалентен другим операторам-членам.

4 голосов
/ 18 августа 2011

Согласно записи в Википедии о строгом слабом порядке , она имеет следующие свойства:

  • Для всех х дело не в том, что х <х (нерефлексивность). </li>
  • Для всех x ≠ y, если x
  • Для всех x, y и z, если x
  • Для всех x, y и z, если x несопоставимо с y, а y несопоставим с z, то x несопоставим с z (транзитивность эквивалентности).

operator< для вашего класса удовлетворяет всем этим свойствам, и этого само по себе достаточно, чтобы квалифицироваться как имеющее строго слабое упорядочение, потому что по определению требуется бинарное отношение <, а не ==.

Однако, как Питер упоминает в своем ответе , определение operator==, учитывающее дополнительную переменную-член, может привести к неинтуитивным результатам, которые могут запутать пользователей вашего класса.

0 голосов
/ 18 августа 2011

Классы не имеют слабого порядка как такового. Строгий слабый порядок - это бинарная функция, например operator<(Foo, Foo). Как только вы поймете это, становится очевидным, почему функция F не может влиять на то, является ли функция G SWO - это независимое свойство G. Вот почему operator== не может повлиять на то, является ли operator< SWO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...