Разве сортировка stl не требует строгого слабого порядка для работы?

#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