将std :: find_if()与具有多个输入参数的比较函数一起使用

时间:2018-09-27 05:49:15

标签: c++ vector

我正在尝试将std::find_if()算法与带有多个输入参数的比较函数一起使用,但是我不确定如何在我的代码中实现它。我已经在各种站点上搜索了std::find_if()的用法,但是它们都使用了带有单个输入参数的比较函数。

using namespace std;

// comparison function
bool range_search(double x, double X1, double X2)
{
    return (x >= X1 && x <= X2) ? true : false;
}

// main   
vector<double> x;

for(int i = 0; i < size; i++){
    x.push_back(...);
};

vector<double>::iterator it = find_if(x.begin(), x.end(), range_search);
int pos_1 = distance(x.begin(), it);

5 个答案:

答案 0 :(得分:4)

没有std::find_if()的版本接受带有多个输入参数的谓词。 std::find_if()遍历指定的迭代器范围,一次将每个元素传递给谓词一次。因此,谓词必须仅接受1个输入参数,不能多也不能少。这就是为什么您看到的所有示例都使用1自变量的原因。

您显示的range_search()函数根本不兼容用作谓词本身。

在C ++ 11和更高版本中,您可以使用lambda捕获要传递给range_search()的额外值,例如:

double X1 = ...;
doubke X2 = ...;
auto it = find_if(x.begin(), x.end(),
    [X1, X2](double x){ return range_search(x, X1, X2); }
);

在C ++ 11之前,您可以改用functor对象:

struct range_search_s
{
    double X1, X2;
    range_search_s(double x1, double x2) : X1(x1), X2(x2) {}
    bool operator()(double x) { return range_search(x, X1, X2); }
};

double X1 = ...;
doubke X2 = ...;
vector<double>::iterator it = find_if(x.begin(), x.end(), range_search_s(X1, X2));

答案 1 :(得分:3)

find_if仅需要对其测试函数使用一个参数,因为它必须依次测试集合中的每个元素。如果要在调用时绑定额外的变量,请使用lambda:

double X1 = 2, X2 = 4;
auto it = find_if(x.begin(), x.end(),
                  [&](double v) { return (v >= X1 && v <= X2); });

答案 2 :(得分:1)

鉴于LEFT JOIN仅接受一元谓词,您可以使用具有多个输入参数的高阶函数来构造一个谓词:

std::find_if

答案 3 :(得分:0)

使用lambda:

vector<double>:: iterator it = find_if(x.begin(),x.end(),[param1, param2, param3](const double& a, const double& b) { /* use param1-3 here*/ });

答案 4 :(得分:0)

通过提供一些参数作为常量,您可以使用std::bind将具有n参数的函数转换为具有n-x参数的函数:

auto fn = std::bind(&range_search, _1, 0.1, 0.9);

_1是第一个参数的占位符,我们要使其保持可变。分别为参数0.10.9传递参数X1X2

由于生成的函数现在只有一个参数,我们可以将其与std::find_if()一起使用:

auto it = std::find_if(x.begin(), x.end(), fn);

您还可以将两者合并为一个通话:

auto it = std::find_if(x.begin(), x.end(), std::bind(&range_search, _1, 0.1, 0.9));

Live Demo at Coliru