【发布时间】:2011-12-27 03:56:15
【问题描述】:
考虑在 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 时中断。 p>
(非常感谢 cmets 了解其他语言如何处理关联容器中的浮点键。)
【问题讨论】:
-
标准对 NaN 并没有什么特别的说法,因为 NaN 是一个 IEEE 概念。换句话说,它依赖于平台。
-
@JohnDibling:这是一个很好的观点,尽管标准承认数字类型可能具有“nan”值;如
<limits>。 -
> 考虑 C++ 中的有序和无序关联容器,键为 double。 > NaN 是有效的密钥类型吗?错误的问题。正确的问题是:内置小于的哪个可能的域包含 NaN?
标签: c++ map nan unordered-map