Объясните работу предиката сравнения стандартной библиотечной функции сортировки C ++? - PullRequest
0 голосов
/ 06 июля 2018

После прочтения некоторых ответов на стеке потока я все еще не мог понять, когда функция сравнения должна возвращать false, а когда она возвращает true.В этом ответе написано, что он моделирует оператор меньше чем, но все же сейчас я думаю, что если функция сравнения выглядит так:

bool compare(const myClass& object1, const myClass& object2)
{
     if(object1.property < object2.property)
         return true;
     else
         return false;
}

будет сортировать вектор myclassобъекты в порядке возрастания.Я прав? ... Я думаю, что все еще в замешательстве.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Несмотря на то, что справиться со стандартом - это хорошо, понять его иногда бывает довольно сложно ...

Попытка в более простых словах:

Если вы хотите отсортировать элементы, вам нужно какое-то отношение порядка, которое определяет, какой из двух элементов должен стоять первым («будь меньшим»). Некоторые типы данных имеют естественный порядок, например целые числа, например: -12 <-10 - 0 - 10 <12. <code>std::sort (без параметра сравнения) использует этот естественный порядок для сортировки элементов по возрастанию.

Третий параметр дает вам возможность std::sort явно указать, как этот порядок будет определен, представьте следующее:

std::vector v({12, 7, 10});
std::sort(v.begin(), v.end(), [](int x, int y){return x > y;});

Выглядит неестественно, не так ли? std::sort интерпретирует сравнение как «меньше», но мы реализовали «больше»! Таким образом, большие значения (которые считаются «меньшими») сортируются перед более мелкими (считаются «большими»), поэтому мы достигли сортировки в порядке по убыванию ...

Таким образом, параметр сравнения, переданный в std::sort, используется либо для сортировки по-другому, чем естественный порядок, либо для явного определения порядка для типов данных, где такой порядок не существует.

Примечание: отношение заказа не обязательно должно быть общим заказом; однако эквивалентные элементы затем могут быть отсортированы в произвольном порядке (хотя вы могли бы вместо этого использовать std::stable_sort, чтобы хотя бы сохранить их относительный порядок перед сортировкой):

int a[12, 7, 10, 7];
std::vector<int*> v({&a[0], &a[1], &a[2], &a[3]});
std::sort(v.begin(), v.end(), [](int* x, int* y) { return *x < *y; });
// v[2] == &a[2]
// v[3] == &a[1]
// BUT:
// v[0] == &a[1] && v[1] == &a[3] || v[0] == &a[3] && v[1] == &a[1]
0 голосов
/ 06 июля 2018

В случае сомнений прочитайте ссылку .

комп -

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

Подпись функции сравнения должна быть эквивалентна следующей:

bool cmp(const Type1 &a, const Type2 &b);

Подпись не обязательно должна иметь const &, но объект функции не должен изменять переданные ей объекты. Типы Type1 и Type2 должны быть такими, чтобы объект типа RandomIt мог быть разыменован, а затем неявно преобразован в оба из них.

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