Если вы полностью опустите Compare
, он получит значение по умолчанию, равное less
(которое дает результат оператора <
, примененного к вашему ключу) - который может или не может даже компилироваться для вашего ключа.key.
Причиной наличия упорядочения является то, что он позволяет реализации быстрее искать элементы по их ключу (при вставке, удалении и т. д.). Чтобы понять, почему, представьте себе поиск слов в словаре.Традиционные словари используют алфавитный порядок, что облегчает поиск слов.Если бы вы готовили словарь для языка, который нелегко упорядочить - скажем, пиктографический язык - тогда либо было бы очень трудно найти слова в нем вообще (вам пришлось бы искать весь словарь), либо выпопытайтесь найти логичный способ упорядочить их (например, поместив сначала все рисунки, которые можно нарисовать, одним штрихом пера, затем двумя линиями и т. д.) - потому что даже если бы этот порядок был совершенно произвольным, это могло бы сделать поискзаписи в словаре гораздо более эффективны.
Точно так же, даже если ваши ключи не нужно упорядочивать для собственных целей и не имеют естественного порядка, вы обычно можете определить порядок, который хорошдостаточно, чтобы решить эти проблемы.Порядок должен быть транзитивным (если a<b
и b<c
, то a<c
) и строгим (никогда не возвращать true для a<a
), асимметричным (a<b
и b>a
никогда не равны true).В идеале он должен упорядочить все элементы (если a
& b
отличаются от a<b
или b<a
), хотя вы можете избежать неприятностей с этим, не будучи истинными (то есть строгое слабое упорядочение ) - хотя это довольно технически.
Действительно, пожалуй, наиболее очевидное использование этого - это редкий случай, когда абсолютно невозможно упорядочить элементы - в этом случае вы можете предоставить оператор сравнения, который всегда возвращает false.Это, скорее всего, приведет к снижению производительности, но, по крайней мере, будет работать правильно.