可替代浮点数作为键

Alternative to floating point as key

本文关键字:浮点数      更新时间:2023-10-16

我想动态存储变量k的值和相应值的列表y1=f(k,1), y2=f(k,2)等。所有数字都是浮点数

例如,我可能有几个切割值k1=0.25和k2=0.5,然后我想存储使用每个切割值计算的数据的不同属性。

例如,我可以使用std::map< float, std::vector<float> >。虽然这个容器似乎可以工作,但它使用浮点数作为键,如果有更好的解决方案,我希望避免这种情况。 在这种情况下,有没有被普遍接受的替代方案?

(我想到的另一种选择是使用std::vector<int>来存储k的值,然后使用std::map< unsigned int, std::vector<float> >来存储y值,整数键是k的向量中的索引。这似乎模仿了SQL数据库的工作。但是它限制了我分析结果的容易程度。

由于std::map使用std::less按顺序维护其键,因此使用浮点键确实没有问题,只要:

  • 您只使用映射来保持密钥的顺序;或
  • 您准备使用一些不依赖于严格的键相等的策略进行查找,例如"最近键"(或"最近键,如果足够接近"),或插值;或
  • 你计算键值的方式是稳定的,所以你可以依靠计算来产生一个查找值,它存在于地图中。

要实现"最接近键"或"插值值",您需要找到括号键;也就是说,最大键不大于搜索键,最小键不小于搜索键。第二个可以在std::map::lower_bound中找到,第一个是相同的键(如果它相等),前一个键,或者不存在(如果值小于每个键)。

我看不出使用整数键有什么好处。如果不进行完全相同的计算,如何查找与浮点值对应的整数?(如果您能够保证始终使用与存储值完全相同的数字查找值,那么浮点数根本不会给您带来任何麻烦。)

std::map要求其键类型遵守严格的弱排序属性,我非常怀疑浮点数(或双精度)不会。如果你不使用精度很高的浮点数,也许你可以把所有的浮点数乘以足够高的十次幂,这样它们就可以转换成唯一的int/long/long类型?