替代浮点作为键
Alternative to floating point as key
我想动态存储变量 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
按顺序维护其键,因此使用浮点键确实没有问题,前提是:
- 您只是使用地图来保持按键的顺序;或者
- 您已准备好使用一些不依赖于严格的键相等性的策略进行查找,例如 "nearest key"(或 "nearest key if close enough")或插值;或者
- 计算键值的方式是稳定的,因此您可以依靠计算来生成映射中存在的查找值。
要实现 "closest key" 或 "interpolated value",您需要找到括号键;即,最大键不大于搜索键,最小键不小于搜索键。第二个可以用 std::map::lower_bound
找到,第一个是相同的键(如果相等)、前一个键或不存在(如果值小于每个键)。
我看不出使用整数键有任何优势。如果不进行完全相同的计算,您将如何查找与浮点值对应的整数? (而且,如果您可以保证您将始终使用与存储它们时使用的数字完全相同的数字来查找值,那么浮点数根本不会给您带来任何麻烦。)
std::map
要求其键类型遵守严格的弱排序 属性,我非常怀疑浮点数(或双精度数)不会。如果您没有使用非常高精度的浮点值,也许您可以将所有这些浮点数乘以足够高的 10 次方,以便将它们转换为唯一的 ints/longs/long 长整数?
我想动态存储变量 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
按顺序维护其键,因此使用浮点键确实没有问题,前提是:
- 您只是使用地图来保持按键的顺序;或者
- 您已准备好使用一些不依赖于严格的键相等性的策略进行查找,例如 "nearest key"(或 "nearest key if close enough")或插值;或者
- 计算键值的方式是稳定的,因此您可以依靠计算来生成映射中存在的查找值。
要实现 "closest key" 或 "interpolated value",您需要找到括号键;即,最大键不大于搜索键,最小键不小于搜索键。第二个可以用 std::map::lower_bound
找到,第一个是相同的键(如果相等)、前一个键或不存在(如果值小于每个键)。
我看不出使用整数键有任何优势。如果不进行完全相同的计算,您将如何查找与浮点值对应的整数? (而且,如果您可以保证您将始终使用与存储它们时使用的数字完全相同的数字来查找值,那么浮点数根本不会给您带来任何麻烦。)
std::map
要求其键类型遵守严格的弱排序 属性,我非常怀疑浮点数(或双精度数)不会。如果您没有使用非常高精度的浮点值,也许您可以将所有这些浮点数乘以足够高的 10 次方,以便将它们转换为唯一的 ints/longs/long 长整数?