有带有数字的容器,它需要查找容器中是否有一个数字等于给定容差内的查询值。有没有办法通过类似于 find_if 方法来实现它以进行比较,例如bool areEqual(double a, double b, double eps)
?
问问题
233 次
3 回答
4
如果可以使用 C++11:
bool areEqual(double a, double b, double eps)
{
return abs(a - b) < eps;
}
int main(int argc, char * argv[])
{
std::vector<double> myvector;
myvector.push_back(1.0);
myvector.push_back(0.0);
myvector.push_back(2.0);
double eps = std::numeric_limits<double>::epsilon();
double value = 0.0;
std::vector<double>::iterator it = std::find_if (myvector.begin(),
myvector.end(),
[=](double d) -> bool
{
return areEqual(d, value, eps);
});
if (it != myvector.end())
printf("Found value: %f\n", *it);
}
于 2013-03-01T07:28:07.863 回答
3
struct CompareFuzzy{
CompareFuzzy(double qVal, double tolerance = 0.0f):m_tolerance(tolerance),m_qVal(qVal){}
bool operator()(double a) {return std::abs( a-qVal ) < m_tolerance;}
private:
double m_tolerance , m_qVal;
}
std::find_if(container.begin(),container.end(),CompareFuzzy(5.0, 0.5));
如上所示,使用老式仿函数,如果使用 C++11,则使用 lambda。
于 2013-03-01T07:26:45.980 回答
3
您可以绑定第二个和第三个参数:
std::find_if(
c.begin(),
c.end(),
boost::bind(
&areEqual,
_1,
number,
eps
)
);
C ++ 11 std::bind 也应该可以解决问题
于 2013-03-01T07:30:35.987 回答