Какой правильный оператор less для простого класса с двумя членами типа int? - PullRequest
0 голосов
/ 26 апреля 2010

Что является правильным operator< для следующего класса?

struct Person {
  int height;
  int width;
  friend bool operator<(const Person&, const Person&);
};

Спасибо!

Ответы [ 4 ]

7 голосов
/ 26 апреля 2010

Это зависит только от вас и от того, как вы хотите, чтобы люди естественным образом сортировали. Если вы хотите, чтобы сначала были короткие люди, но худые, прежде чем они будут высокими, если они одного роста:

friend bool operator<(const Person& a, const Person& b) {
    return a.height != b.height ? a.height < b.height : a.width < b.width;
}

Если вы хотите, чтобы определенная площадь поверхности человека определяла порядок:

friend bool operator<(const Person& a, const Person& b) {
    return a.height * a.width < b.height * b.width;
}
1 голос
/ 26 апреля 2010

Чтобы поместить класс в набор, вам также нужно позаботиться об операторе ==. С данными, которые у вас есть в классе Person, я не думаю, что вы можете определить хороший оператор ==. Или вы имеете в виду, что два человека, имеющие одинаковую ширину и высоту, одинаковы? Я добавлю некоторый уникальный идентификатор, который позволяет определить полный порядок для персоны.

Если у вас нет больше информации, вы можете использовать лексикографический порядок, как указано в другом ответе.

Но никогда не используйте область для их заказа, в противном случае вам нужно будет определить равенство в зависимости от области, а затем (4,5) == (5,4), чтобы получить полный заказ. Я полагаю, вы не хотите этого. Обратите внимание, что если! ((4,5) <(5,4)) и (4,5)! = (5,4), мы можем вывести, что (5,4) <(4,5), что неверно тоже. </p>

Если вы не используете упорядоченную природу набора, вы можете подумать об использовании unordered_set или хеш-таблицы. Но в любом случае вам нужно будет позаботиться об операторе ==.

1 голос
/ 26 апреля 2010

Зависит от того, как вы хотите организовать / отсортировать экземпляры человека. Примером будет

 bool operator<(const Person& one, const Person& two) {
     return one.height < two.height ||(one.height == two.height && one.width <two.width);
 }

т.е. сначала посмотрите на высоту (упорядочив по наименьшему первому), если высота одинакова, посмотрите на ширину, упорядочив сначала по более узкой

1 голос
/ 26 апреля 2010

Мой шаблонный способ сделать это:

friend bool operator<(const Foo& l, const Foo& r) {
    return l.width < r.width? true
         : r.width < l.width? false
         : l.height < r.height;
}

Но используйте вместо этого typedef pair<int, int>, если можете.

Это несколько бессмысленно упорядочивает вещи, используя все доступные данные. (Здесь все упорядочено сначала по ширине, а затем по высоте, если ширина равна.) Если вы используете упорядочение только для поиска идентичных элементов, это, вероятно, то, что вам нужно.

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