Требование к компаратору для ключевого типа ассоциативного контейнера (например, std :: map) заключается в том, что он налагает строгий слабый порядок на элементы ключевого типа.
Для данного компаратора comp (x, y)
мы определяем Equiv (x, y) =! Comp (x, y) &&! Comp (y, x)
.
Требования к comp (x, y)
, являющемуся строгим слабым порядком, следующие:
! Comp (x, x)
для всех x
) comp (a, b)
и comp (b, c)
, то comp (a, c)
). эквив (a, b)
и эквив (b, c)
, то эквив (a, c)
) std: : less
(компаратор по умолчанию) использует оператор <
, который не создает строгий слабый порядок из-за NaN
. Поскольку x
NaN
x
, NaN
эквивалентно всем числам с плавающей запятой в этом компараторе, это нарушает условие № 3: эквивалент (1.0, NaN)
и экв (NaN, 2.0)
, но не экв (1.0, 2.0)
. Для чисел с плавающей запятой IEEE, кроме NaN, это строгий слабый порядок (где каждое число имеет свой собственный класс эквивалентности, за исключением 0
и -0
).
Имеет ли это означает, что стандарт C ++ не разрешает использовать IEEE float (и (long) double) в качестве типа ключа в ассоциативном контейнере из-за вышеупомянутой проблемы, даже если я уверен, что NaN никогда не вставляется в контейнер? Я не совсем уверен в формулировке «элементы Key
» в стандарте - означает ли это все возможные элементы или только элементы, которые попадают в контейнер.
Примечание: вопрос не в о проблемах по усечение / округление, скорее всего, скоро я опубликую другой вопрос по этому поводу.
Вздох . Я должен был задать вопрос без указания числа с плавающей запятой, я просто подумал, что это хороший пример.
На самом деле вопрос : разрешено ли использовать компаратор, который устанавливает только строгий слабый порядок для элементов, которые получают положить в контейнер не все возможные экземпляры ключевого типа? Пожалуйста, не отвечайте просто «да» или «нет», мне нужны ссылки на стандартные / предыдущие дискуссии по этому поводу / ответ члена комитета или что-то в этом роде.