Допустимые ли типы ключей IEEE float для std :: map и std :: set?

Предпосылки

Требование к компаратору для ключевого типа ассоциативного контейнера (например, std :: map) заключается в том, что он налагает строгий слабый порядок на элементы ключевого типа.

Для данного компаратора comp (x, y) мы определяем Equiv (x, y) =! Comp (x, y) &&! Comp (y, x) .
Требования к comp (x, y) , являющемуся строгим слабым порядком, следующие:

  1. Непогибимость (! Comp (x, x) для всех x )
  2. Транзитивность упорядочения (если comp (a, b) и comp (b, c) , то comp (a, c) ).
  3. ] Транзитивность эквивалентности (если эквив (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 » в стандарте - означает ли это все возможные элементы или только элементы, которые попадают в контейнер.

Примечание: вопрос не в о проблемах по усечение / округление, скорее всего, скоро я опубликую другой вопрос по этому поводу.

Обновление:

Вздох . Я должен был задать вопрос без указания числа с плавающей запятой, я просто подумал, что это хороший пример.

На самом деле вопрос : разрешено ли использовать компаратор, который устанавливает только строгий слабый порядок для элементов, которые получают положить в контейнер не все возможные экземпляры ключевого типа? Пожалуйста, не отвечайте просто «да» или «нет», мне нужны ссылки на стандартные / предыдущие дискуссии по этому поводу / ответ члена комитета или что-то в этом роде.

21
задан etarion 27 January 2011 в 13:03
поделиться