Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果容器中存在具有给定错误容差的编号,则查找\u_C++_Stl - Fatal编程技术网

C++ 如果容器中存在具有给定错误容差的编号,则查找\u

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)

有一个带有数字的容器,它需要找出容器中是否有一个数字等于给定容差内的查询值。是否有一种类似于find_的方法来实现它,例如
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
   )
);