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