#c
Вопрос:
От http://stdcxx.apache.org/doc/stdlibref/less-equal.html
—
Объект less_equal можно передать любому алгоритму, для которого требуется двоичная функция. Например, алгоритм sort() может принимать двоичную функцию в качестве альтернативного объекта сравнения для сортировки последовательности. less_equal будет использоваться в этом алгоритме следующим образом:
vector<int> vec1;
sort(vec1.begin(), vec1.end(),less_equal<int>());
—
Теперь я в замешательстве, верна ли приведенная выше документация ?
Комментарии:
1. Вы можете отсортировать его по своему усмотрению с помощью пользовательского компаратора.
2. @крис, ты уверен ? Я думаю, что результат может быть неопределенным, если компаратор не является строгим слабым порядком
3. Вы пробовали на самом деле добавить несколько равных значений в вектор, а затем отсортировать его? Как правило, именно тогда произойдет утверждение/исключение. Вы можете передать все, что захотите, в качестве компаратора для пустого вектора, так как он никогда не будет использоваться.
4. @Retired nin разработка на основе тестирования-это нормально, но лучше знать правильное поведение, в конце концов, есть только так много вещей, которые можно протестировать.
5. @RetiredNinja: что заставляет вас думать, что вы получите утверждение или исключение, если оно не сработает?
Ответ №1:
Вы правы, std::sort
требуется, чтобы компаратор определил строгий слабый порядок.
Что означает, что std::less_equal
с этим не следует использовать std::sort
. Тем не менее, он все еще может использоваться с рядом других стандартных алгоритмов, которые используют двоичную функцию и у которых нет строгого требования слабого упорядочения.
Комментарии:
1. Так ли это, что сортировка stdcxx не соответствует стандарту и все еще работает с
2. Учитывая, что они заявляют о соответствии своим стандартам
sort
(внизу этой страницы ), то именно их документация неверна. Вы должны использоватьless_equal
его вместе с ним.3. @Сан: Твоя логика обратная.
sort
требуется для работы, если вы действительно предоставляете строгий слабый заказ. Если вы не предоставите строгий слабый заказ, все требования к нему будут сняты. Это не обязательно для успеха, но и не обязательно для провала.4. @san если все , что вы когда-либо делаете, — это сортируете элементы, которые все неравнозначны (т. е. Либо
x <= y
илиy <= x
, но не оба), вам сойдет с рук использование<=
в качестве компаратора. См. также пункт 19 Эффективного STL Скотта Мейерса («поймите разницу между эквивалентностью и равенством»).5. У меня есть один вопрос. Почему std::sort нужно сравнивать как a < b, так и b