gpt4 book ai didi

c++ - 传递 operator== 以在 C++ 中设置

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:59 24 4
gpt4 key购买 nike

我想要一个set<double> S;并在其中插入一些 double 。但我希望集合考虑 1.0000001 == 1.0000000 (使用 epsilon 比较 double )(我的意思是如果我将两个数字都插入到集合中,set.size() 应该等于 1)。我知道如何将 operator() (用于比较)传递给集合,但我不知道如何传递函数:

const double eps = 1e-8;
bool operator==(double a, double b)
{
return abs(a - b) < eps;
}

到集合。

P.S:感谢 Sid。 @Sid:我发现:std::set 不使用operator==。元素 a 和 b 被认为是相等的当且仅当 !(a < b) && !(b < a)。

最佳答案

简单的答案是你不能,至少不是那么容易。你必须定义一个比较运算符,它定义了一个严格的弱订购。如果你有类似的东西:

bool
cmpDouble( double lhs, double rhs )
{
return abs( lhs - rhs ) < eps
? false
: lhs < rhs;
}

然后 ! (a < b) && ! (b < a)没有定义等价关系,因此未满足主要要求。

可以使用类似的东西:

bool
cmpDouble( double lhs, double rhs )
{
double iLhs;
modf( 1e8 * lhs, &iLhs );
double iRhs;
modf( 1e8 * rhs, &iRhs );
return iLhs < iRhs;
}

但坦率地说,我怀疑如果你的 double 来源需要这个之类的,它们可能不适合存储在 set 中.

关于c++ - 传递 operator== 以在 C++ 中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9165242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com