をキーとする 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 が異なります。これも私が期待するものではありません。
規格はこの問題について何か言う必要がありますか?
更新:以下の優れた回答のおかげで、 NaN が含まれているときに何か他std::map
のものを挿入すると壊れることに注意してください。
(他の言語が連想コンテナー内の浮動小数点キーをどのように処理するかについて、コメントをいただければ幸いです。)