cpp中unordered_set<double>存在浮点数2.5,为什么查找2.5是否存在会失败?
时间: 2024-03-04 22:48:47 浏览: 65
unordered_map和unordered_set的模拟实现
5星 · 资源好评率100%
在`unordered_set`中使用浮点数作为键可能会导致查找失败的问题,这是因为浮点数在计算机中是以近似值存储的,而不是精确值。例如,你可能会认为浮点数2.5应该是精确的,但是在计算机中,它可能会被存储为2.4999999999999999999或2.50000000000000000001等近似值。当你在`unordered_set`中查找2.5时,实际上是在查找这个近似值,而不是精确的2.5,因此可能会失败。
为了解决这个问题,你可以使用一个精度范围来进行查找。例如,你可以定义一个小于号运算符,并使用`std::abs`函数来比较两个浮点数的差是否小于一个给定的精度范围,然后将这个小于号运算符传递给`unordered_set`的模板参数中,以保证查找的精度。示例如下:
```
#include <unordered_set>
#include <iostream>
#include <cmath>
struct DoubleHash {
double eps = 1e-9; // 设置一个精度范围
bool operator()(double x, double y) const {
return std::abs(x - y) < eps;
}
};
int main() {
std::unordered_set<double, DoubleHash> mySet{2.5};
if (mySet.find(2.5) != mySet.end()) {
std::cout << "2.5 exists in mySet." << std::endl;
} else {
std::cout << "2.5 does not exist in mySet." << std::endl;
}
return 0;
}
```
输出结果为:
```
2.5 exists in mySet.
```
需要注意的是,使用一个精度范围来进行查找可能会影响查找的效率。因此,你需要根据实际情况来选择适当的精度范围。
阅读全文