C++ 浮点作为键的替代方案

C++ 浮点作为键的替代方案,c++,dictionary,vector,key,C++,Dictionary,Vector,Key,我想动态存储一个变量k的值和一系列相应的值y1=f(k,1),y2=f(k,2),等等。所有的数字都是浮点数 例如,我可能有几个切割值k1=0.25和k2=0.5,然后我想存储使用每个切割值计算的数据的不同属性 例如,我可以使用std::map。虽然这个容器似乎可以工作,但它使用浮点作为键,如果有更好的解决方案,我希望避免使用浮点 在这种情况下,有没有普遍接受的替代方案 (我想到的另一种选择是使用std::vector存储k的值,然后使用std::map存储y值,整数键是k的向量中的索引。这似乎

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

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

例如,我可以使用
std::map
。虽然这个容器似乎可以工作,但它使用浮点作为键,如果有更好的解决方案,我希望避免使用浮点

在这种情况下,有没有普遍接受的替代方案


(我想到的另一种选择是使用
std::vector
存储k的值,然后使用
std::map
存储y值,整数键是k的向量中的索引。这似乎模仿了SQL数据库的功能。但它限制了我分析结果的容易程度。)由于
std::map
使用
std::less
按顺序维护其键,因此使用浮点键确实没有问题,前提是:

  • 你只是用地图把钥匙按顺序排列;或
  • 您准备使用一些不依赖于严格的键相等的策略进行查找,例如“最近的键”(或“如果足够近,则为最近的键”)或插值;或
  • 计算键值的方式是稳定的,因此可以依靠计算来生成地图中存在的查找值
要实现“最近的关键点”或“插值”,您需要找到括号中的关键点;即,最大键不大于搜索键,最小键不小于搜索键。第二个可以通过
std::map::lower_bound
找到,第一个是相同的键(如果相等)、上一个键,或者不存在(如果值小于每个键)


我不认为使用整数键有什么好处。如果不进行完全相同的计算,如何查找与浮点值对应的整数?(如果您可以保证总是使用与存储值完全相同的数字来查找值,那么浮点不会给您带来任何麻烦。)

std::map
要求其键类型遵守严格的弱排序属性,我非常怀疑浮点(或双精度)不会。如果您没有使用非常高精度的浮点值,那么您可以将所有这些浮点值乘以10的足够高的幂,以便它们可以转换为唯一的整数/长/长std::pair,例如,0.25可以写为
std::pair
,然后将该对用作键,不要忘记重载
运算符@nneonneo:“浮点作为键”的问题是它是舍入敏感的。定点数的取整方式不同,对取整的敏感度稍低,但肯定不能免疫。浮点数排序的唯一问题是NaN。只要您不尝试使用NaN作为键,那么浮动是严格有序的。为什么不呢?