C++ 如果容器中存在具有给定错误容差的编号,则查找\u
有一个带有数字的容器,它需要找出容器中是否有一个数字等于给定容差内的查询值。是否有一种类似于find_的方法来实现它,例如C++ 如果容器中存在具有给定错误容差的编号,则查找\u,c++,stl,C++,Stl,有一个带有数字的容器,它需要找出容器中是否有一个数字等于给定容差内的查询值。是否有一种类似于find_的方法来实现它,例如bool areEqual(双a、双b、双eps)?结构比较模糊{ 比较模糊(双qVal,双公差=0.0f):m_公差(公差),m_qVal(qVal){} bool运算符()(双a){return std::abs(a-qVal)
bool areEqual(双a、双b、双eps)
?结构比较模糊{
比较模糊(双qVal,双公差=0.0f):m_公差(公差),m_qVal(qVal){}
bool运算符()(双a){return std::abs(a-qVal)
如上图所示,如果使用C++11,请使用或使用lambda。如果可以使用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);
}
bool areEqual(双a、双b、双eps)
{
返回abs(a-b)bool
{
回报率相等(d,值,每股收益);
});
如果(it!=myvector.end())
printf(“找到的值:%f\n”,*它);
}
您可以绑定第二个和第三个参数:
std::find_if(
c.begin(),
c.end(),
boost::bind(
&areEqual,
_1,
number,
eps
)
);
C++11 std::bind也应该做到这一点容器的内容是否已排序?类似于?不,内容未排序。嗯,我倾向于不同意,
std::numeric\u limits::epsilon()
对于比较任意双精度似乎不是一个好的容差。@us2012它取决于您试图比较的值。在我的情况下,它应该起作用。否则,应选择另一个ε值。我使用的std::numeric\u limits::epsilon()
仅用于演示目的。是否可以从lambda表达式调用areEqual,而不是复制函数内容?@ChesnokovYuriy当然,修改了示例。如果不想使用Boost,还可以使用现有的和旧编译器中的std::tr1::bind
(我知道它与GCC 4.1.2一起提供)。此外,我不确定这是否真的有效。您不需要调整bind
的结果,以便将其与标准算法一起使用(因为它缺少所需的typedef)?请参阅。在C++11中,为了清晰和可读性,我更喜欢lambda而不是bind。是的,我不想使用boost。std::bind的逻辑是什么?@ChesnokovYuriy然后使用一个lambda来调用该函数:[=](双a){返回areEqual(a,number,eps);}
的作用与答案中的绑定相同。我认为它需要传递对容器的引用,而不是单个qVal。因为我们有一个容器来查找内部的值,所以我理解逻辑。要查找的值传递给构造函数,容器中的所有值都传入() operator@ChesnokovYuriy我会把它称为每个,而不是全部,但确实如此。我本质上是一个
方法,实现了其他人展示的lamda的功能。您可以使用类而不是结构,并从一元数继承_function@ChesnokovYuriy你可以,也许没有必要,除非你需要它。
std::find_if(
c.begin(),
c.end(),
boost::bind(
&areEqual,
_1,
number,
eps
)
);