PartialOrdering, StrictWeakOrdering, TotalOrdering, в чем основное отличие в приложении
Из-за нерефлексивности и транзитивности оператор <всегда удовлетворяет определению частичного упорядочения. Определение строгого слабого порядка является более строгим, а определение полного порядка - еще более строгим.
И я также прочитал определение строгого слабого порядка в документе: StrictWeakOrdering
Первые три аксиомы, нерефлексивность, антисимметрия и транзитивность, являются определением частичного упорядочения; Транзитивность эквивалентности требуется по определению строгого слабого порядка. Тотальный порядок - это тот, который удовлетворяет еще более строгому условию: эквивалентность должна совпадать с равенством.
Я не совсем уверен в этом определении. Некоторые основные вопросы:
1. Частичное упорядочение неявно определяет эквивалентность?
2. Как насчет строгого слабого заказа и полного заказа?
3.STL требует строгого слабого упорядочения в алгоритмах сортировки, почему не частичное или полное упорядочение? Для этого вопроса я прочитал некоторые учебники, которые доказывают, что действительные правила сравнения доказывают, что правило удовлетворяет трем аксиомам: нерефлексивность, антисимметрия, транзитивность, которая является определением для частичного упорядочения, и документ ссылается на то, что оператор <всегда удовлетворяет этому определению, поэтому почему мы не можем просто сравнить объекты, используя частичное упорядочение или, что то же самое, используя оператор
1 ответ
Частичное упорядочение, по сути, <=
, Если оба a <= b
а также b <= a
тогда вы можете сказать, что a
эквивалентно b
, Но также возможно, что ни a <= b
ни b <= a
- эти два элемента несопоставимы. В результате вы не можете навязать общий заказ (например, std::sort
потребуется) на множестве с частичным отношением порядка - в лучшем случае вы можете сделать топологическую сортировку. Вы также не можете получить отношение эквивалентности - опять же, могут быть элементы, которые несопоставимы.
Строгий слабый порядок как <
, Это не позволяет иметь оба a < b
а также b < a
и если нет a < b
ни b < a
Вы можете просто произнести a
а также b
эквивалент.
Полное упорядочение - это просто строгое слабое упорядочение, когда два элемента эквивалентны тогда и только тогда, когда они равны (что имеет смысл только в том случае, если у вас есть предикат сравнения равенства в дополнение к предикату less-than, и нет стандартного библиотечного алгоритма C++, который использует оба в то же время, поэтому проблема в значительной степени спорная в этом контексте).