我想为一组浮点值指定一个唯一对象。这样做,我正在探索两种不同的选择:在C++中缓存浮点值
第一个选项是维持类中的静态哈希表(std::unordered_map<double,Foo*>
),并避免所有重复的在第一时间创建。这意味着,不是调用构造函数,而是检查值是否已经存在于散列中,如果是,则重新使用它。我还需要从析构函数中的哈希映射中删除值。
第二种选择是在创建过程中允许重复值,只尝试一次对它们进行排序,并在所有值创建后检测重复项。我想我会需要散列地图进行排序。或者,一个有序的地图('std :: map)是否也能正常工作?
是否有理由期望第一个选项(我更喜欢)在任何情况下都会比较慢?也就是说,如果我一次执行所有条目而不是一次执行一个条目,会发现重复条目要快得多吗?
我知道当兑现浮点数时的陷阱,并且会阻止将非数字和无穷大添加到地图中。对于相同的常量,一些重复的条目也不是问题,如果发生少数条目 - 它只会导致非常小的速度损失。
对于浮点数的*大*陷阱呢?他们不是确切的?你如何处理? – jalf 2012-02-17 11:51:37
@jalf浮点数是确切的。确切的值可能不是您所期望或想要的值,但每个浮点数都具有确切的值。关于将它们用作散列表中的键,它取决于数字的来源。 – 2012-02-17 12:01:22
嗯,我的'Foo'对象将包含浮点数的副本,所以我可以简单地检查,如果这个数字匹配散列键的。再次,一些重复的条目(不会很多)不是一个严重的问题。 – Joel 2012-02-17 12:10:18