传递运算符==以在c++中设置
passing operator== to set in c++
我想有一个set<double> S;
,并在其中插入一些双打。但我希望集合考虑1.0000001 == 1.0000000
(使用epsilon比较双打)(我的意思是,如果我将两个数字都插入集合,set.size()应该等于1)。我知道如何将运算符()(用于比较)传递到集合,但我不知道如何传递函数:
const double eps = 1e-8;
bool operator==(double a, double b)
{
return abs(a - b) < eps;
}
去片场。
p.S.:谢谢希德@Sid:我发现:运算符==没有被std::set使用。元素a和b被认为是相等的iff!(a<b)&!(b<a)。
简单的答案是你不能,至少不是那么容易。你必须定义一个比较运算符,该运算符定义一个严格的弱订购。如果你有类似的东西:
bool
cmpDouble( double lhs, double rhs )
{
return abs( lhs - rhs ) < eps
? false
: lhs < rhs;
}
则CCD_ 3不定义等价关系,所以一个主要要求没有得到满足。
可以使用以下内容:
bool
cmpDouble( double lhs, double rhs )
{
double iLhs;
modf( 1e8 * lhs, &iLhs );
double iRhs;
modf( 1e8 * rhs, &iRhs );
return iLhs < iRhs;
}
但坦率地说,我怀疑如果你的替身来源需要这个在某种程度上,它们可能不适合存储在set
中。
如果您有比较函数,那么为什么需要运算符==?看看下面的线索。
std::设置用户定义的类型,如何确保没有重复的
看看梅尔达德的回答。
关闭@Sid提供的链接,似乎(无论多么明智或不明智),您可以通过如下定义比较运算符来做到这一点:
const double eps = 1e-8;
bool less_than(double a, double b)
{
return a < b - eps;
}
bool greater_than(double a, double b)
{
return a > b + eps;
}
在将替身插入集合之前,您需要量化它们。
如果您考虑1.0000000<=范围内的所有数字x<1.00000002要相同,只需将该范围内的所有数字替换为1.0000000,然后将它们插入集合中。同样地,对于1.000002<=x<1.000004等
这种方法避免了比较运算符和传递性的所有问题。
这似乎是个坏主意。考虑数字1.0000000
、1.0000001
、1.0000002
的情况。如果先插入1.0000001
,则不允许将其他任何数字添加到集合中。如果您先添加1.0000000
或1.0000002
,则可以稍后添加另一个。
此外,set
使用operator<
来定义其关系,而不是相等。我看不出有什么方法可以编写一个依赖于epsilon的严格弱排序,它不会产生一个正确排序的容器。容器仅依赖于operator<
或其他比较,并且无法指定相等操作。
更好的方法是只使用普通的<
比较,并在构建集合后进行后处理,以清理您不再需要的元素。如果您向我们提供有关您试图解决的真实问题的更多信息,我们可能会提供帮助。
const double eps = 1e-8;
bool compare(double a, double b)
{
return (abs(a - b) > eps) ? (a < b) : false;
}
set<int,bool(*)(double,double)> set (compare);
struct Compare
{
bool operator()(double a, double b) const
{
return (abs(a - b) > eps) ? (a < b) : false;
}
};
set<int,Compare> set;
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?