使用带有多个输入参数的比较函数的 std::find_if()

Ken*_*Ken 2 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);
Run Code Online (Sandbox Code Playgroud)

Der*_*nes 5

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

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


Rem*_*eau 5

没有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); }
);
Run Code Online (Sandbox Code Playgroud)

在 C++11 之前,您可以使用函子对象代替:

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));
Run Code Online (Sandbox Code Playgroud)