Рассмотрим упорядоченные и неупорядоченные ассоциативные контейнеры в 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.
(Буду очень признателен за комментарии о том, как другие языки обрабатывают ключи с плавающей запятой в ассоциативных контейнерах.)