背景
关联容器的键类型(例如std::map)上的比较器的要求是,它对键类型的元素施加了严格的弱顺序。
对于给定的比较器comp(x, y)
,我们定义equiv(x, y) = !comp(x, y) && !comp(y, x)
。
comp(x, y)
是严格弱顺序的要求是
x
)comp(a, c)
).equiv(a, c)
),则为!comp(x, x)
);如果为comp(a, b)
,则为comp(b, c)
;如果为comp(b, c)
,则为等价(如果为equiv(a, b)
,则为equiv(b, c)
std::less<float>
(默认比较器)使用operator<
,它不会因为NaN
而创建严格的弱顺序。由于x < NaN
和NaN < x
对于所有x
都为false,因此NaN
等同于此比较器下的所有浮点数,这违反了条件#3:equiv(1.0, NaN)
和equiv(NaN, 2.0)
,但不是equiv(1.0, 2.0)
。对于除NaN之外的IEEE浮点数,它是一个严格的弱顺序(其中,除了0
和-0
之外,每个数字都有它自己的等价类)。
问题是
这是否意味着,即使我确保NaN永远不会被插入到容器中,这是否意味着C++标准不允许将IEEE浮点数(和(长)双精度)用作关联容器中的键类型?我不太确定标准中的“Key
元素”的措辞--它是指所有可能的元素,还是仅指最终在容器中的元素。
注意:问题不是关于wrt的问题。截断/舍入,我可能很快就会发布一个关于这个问题的不同问题。
更新:
叹一口气。我应该在没有指定float的情况下提出这个问题,我只是觉得这是一个很好的例子。
真正的问题是:是否允许使用只对放入容器的元素施加严格弱顺序的比较器,而不是键类型的所有可能实例?请不要只回答“是”或“不是”,我希望参考一些关于这方面的标准/先前的讨论/一个委员会成员或其他人的回答。
https://stackoverflow.com/questions/4816156
复制相似问题