首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于std::map和std::set,IEEE浮点数是有效的键类型吗?

对于std::map和std::set,IEEE浮点数是有效的键类型吗?
EN

Stack Overflow用户
提问于 2011-01-27 20:14:54
回答 4查看 3.6K关注 0票数 22

背景

关联容器的键类型(例如std::map)上的比较器的要求是,它对键类型的元素施加了严格的弱顺序。

对于给定的比较器comp(x, y),我们定义equiv(x, y) = !comp(x, y) && !comp(y, x)

comp(x, y)是严格弱顺序的要求是

  1. Irreflexibility (对于排序的所有x)
  2. Transitivity,则为comp(a, c)).
  3. Transitivity (如果为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 < NaNNaN < 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的情况下提出这个问题,我只是觉得这是一个很好的例子。

真正的问题是:是否允许使用只对放入容器的元素施加严格弱顺序的比较器,而不是键类型的所有可能实例?请不要只回答“是”或“不是”,我希望参考一些关于这方面的标准/先前的讨论/一个委员会成员或其他人的回答。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4816156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档