Почему std::sort работает, когда функция сравнения использует больше (>), но не больше или равно (>=)?

В WIN32, Visual Studio 2022. Когда я определяю vector<int>, содержащий сто нулей, и сортирую его с помощью приведенного ниже кода, выдается исключение «недопустимый компаратор».

vector<int> v(100, 0);
sort(v.begin(), v.end(), [](const int& a, const int& b)
    {
        return a >= b;
    });

Однако, если я использую return a > b, он будет работать хорошо. Это почему?

Стандарт требует «строгого слабого упорядочения», в частности, comp(a,a) должно быть ложным. (начните с en.cppreference.com/w/cpp/алгоритм/сортировка, нажмите Compare и т. д.)

Marc Glisse 23.04.2022 10:09

Обратите внимание, что в стандартной библиотеке VC C++ есть дополнительный код отладки, помогающий отлавливать сравнения, которые не реализуют строгое слабое упорядочение. Если тот же сорт работает (или кажется, что работает) на другой платформе или в сборке «Release», это почти всегда происходит из-за того, что сравнение не совсем правильное.

Adrian McCarthy 23.04.2022 16:52
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
3
2
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это как раз то, что нужно для работы. Вам нужен строгий слабый порядок.

Для обоснования я считаю, что достаточным объяснением является то, что это позволяет вам определить, равны ли эти элементы (полезно, например, для std::sets). <= или >= не могу этого сделать.

<= или >= тоже могут это сделать, но, похоже, просто решили использовать < вместо любого другого отношения. С учетом этого решения реализованы стандартные библиотечные средства, и они сильно полагаться на это.

Большое спасибо. Ваш ответ мне очень полезен.

unknown 23.04.2022 10:20

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

Fureeish 23.04.2022 10:28

@unknown Похоже, принятие не сработало.

HolyBlackCat 23.04.2022 13:49

проблема заключается в том, что предоставленная вами компаратор (она же функция сравнения) не реализует строгий-слабый порядок и, следовательно, нарушает является предварительным условием std::sort, ведущим к неопределенное поведение.

Из std::sort:

comp - comparison function object (i.e. an object that satisfies the requirements of Compare) which returns ​true if the first argument is less than (i.e. is ordered before) the second.

И от Сравнивать:

The return value of the function call operation applied to an object of a type satisfying Compare, when contextually converted to bool, yields true if the first argument of the call appears before the second in the strict weak ordering relation induced by this type, and false otherwise.

В основном это означает, что функция сравнения Compare, которую мы предоставляем, не должна оцениваться как true для обоих выражений: Compare(x, y) и Compare(y, x), где x и y — некоторые аргументы. В противном случае компаратор не подчиняется строгому слабому порядку.

Чтобы решить эту проблему, вы должны заменить >= на >.

Другие вопросы по теме