考虑 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 。
(我将非常感谢有关其他语言如何处理关联容器中的浮点键的评论。)