【发布时间】:2012-02-06 18:31:22
【问题描述】:
我想要一个set<double> S; 并在其中插入一些双打。但我希望集合考虑1.0000001 == 1.0000000 (使用epsilon 比较双打)(我的意思是如果我将两个数字都插入到集合中,set.size() 应该等于1)。我知道如何将 operator() (用于比较)传递给集合,但我不知道如何传递函数:
const double eps = 1e-8;
bool operator==(double a, double b)
{
return abs(a - b) < eps;
}
到集合。
P.S:感谢希德。 @Sid:我发现:std::set 不使用 operator==。当 !(a
【问题讨论】:
-
我不是 C++ 专家,但我很确定您应该使用传递关系作为集合的比较。您的
operator==不具有传递性。 -
@Complicatedseebio 这两个数字中的哪一个在集合中并不重要。重要的是其中一个在集合中。
-
这个等式的定义听起来很麻烦,因为你打破了等式的传递属性(如果 A==B 和 B==C 则 A==C)。取 A=1,B=1+eps 和 C=1+2*eps,A==B,B==C,但 A!=C。如果这会以不可预知的方式破坏 std::set 的实现,我不会感到惊讶。
-
你可能想要 fabs( ) 而不是 abs( )。并且感兴趣的比较函数将是 less()。
标签: c++ templates comparison operator-overloading set