0

番号の付いたコンテナがあり、指定された許容範囲内のクエリ値に等しい番号がコンテナにあるかどうかを確認する必要があります。比較のために渡すfind_ifメソッドと同様にそれを実装する方法はありbool areEqual(double a, double b, double eps)ますか?

4

3 に答える 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を使用する場合はラムダを使用します。

于 2013-03-01T07:26:45.980 に答える
3

2番目と3番目のパラメーターをバインドできます。

std::find_if(
   c.begin(),
   c.end(),
   boost::bind(
       &areEqual,
       _1,
       number,
       eps
   )
);

また、C ++ 11 std::bindはトリックを行う必要があります

于 2013-03-01T07:30:35.987 に答える