std::为双值设置自定义比较函数.insert()不起作用



我通过创建了一个集合

bool(*fn_pt)(const double&, const double&) = comp_double;
std::set<double, bool(*)(const double&, const double&) > values(fn_pt);

其中我的comp_double函数由给出

bool comp_double (const double& p1, const double& p2)
{
return (std::abs(p1-p2)<1e-05);
}

我插入了两个伪元素,values.insert(0.01(和values.insert0.02,但我的集合大小仍然为零。没有编译器警告或错误,所以我想问题出在我的comp_double函数中。如有任何意见,我们将不胜感激!

最佳

首先,我们应该记住std::set关联容器(仅包含"键"(。是的,我们可以为关联容器提供自己的比较操作。这个运算必须符合严格的弱序(我们可以把它看作是一个"小于">(,意味着具有以下性质:

  • 两个键不能同时为";小于";彼此(同样,密钥本身不能产生"较少"的结果(
  • 比较必须是可传递的。如果是key1 < key2key2 < key3,则是key1 < key3
  • 如果我们有两把钥匙,而这两把都不是"钥匙";小于";另一方面,它们必须是等价的

考虑这种情况:

key1 = 0.000001;
key2 = 0.000002;
abs(key1 - key2) == 0.000001; // which is less than 0.00001, true
abs(key2 - key1) == 0.000001; // same, true too

它们中的每一个都是";较少的";这意味着它们违反了第一个约束。此外,这里的键将对于";较少的";自身

你可能想看看:使用epsilon比较浮点是否打破了严格的弱排序?

有关Compare要求的更多信息,请查看文档。

最新更新