Является ли NaN допустимым значением ключа для ассоциативных контейнеров?

Рассмотрим упорядоченные и неупорядоченные ассоциативные контейнеры в C ++ с ключом double .

Является ли NaN допустимым типом ключа?

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

Я понятия не имею, что касается неупорядоченных контейнеров.

Вот что происходит в GCC 4.6.2:

#include <map>
#include <unordered_map>

#include <cmath>

#include <iostream>
#include <prettyprint.hpp>

int main()
{
  typedef std::map<double, int> map_type; // replace by "unorderd_map"

  map_type dm;
  double d = std::acos(5); // a good nan

  dm[d] = 2;
  dm[d] = 5;
  dm[d] = 7;

  std::cout << "dm[NaN] = " << dm[d] << ", dm = " << dm << std::endl;
}

Для упорядоченной карты я получаю:

dm[NaN] = 7, dm = [(nan, 7)]

Для неупорядоченной карты я получаю:

dm[NaN] = 0, dm = [(nan, 0), (nan, 7), (nan, 5), (nan, 2)]

Итак, в упорядоченной карте все NaN обрабатываются одинаково, что я и ожидал, хотя это казалось NaN нарушит требования. Однако для неупорядоченной карты я никогда не смогу снова получить элемент, и все NaN разные. Это тоже не то, чего я ожидал.

Следует ли в стандарте что-нибудь сказать по этому поводу?

Обновление: Благодаря отличным ответам, приведенным ниже, обратите внимание, что std :: map сломается, если вы вставите что-нибудь еще , если в нем NaN.

(Буду очень признателен за комментарии о том, как другие языки обрабатывают ключи с плавающей запятой в ассоциативных контейнерах.)

27
задан Kerrek SB 11 November 2011 в 16:33
поделиться