【问题标题】:Passing an iterarator to a unary predicate with std::find_if使用 std::find_if 将迭代器传递给一元谓词
【发布时间】:2018-07-07 18:04:09
【问题描述】:

我试图找到满足v[i] <= x < v[i + 1] 的向量元素i 的索引i,其中x 是给定的任意值。我正在尝试使用find_if 函数,但似乎find_if 从迭代器而不是迭代器传递值,因此我无法找到执行x < v[i + 1] 比较的方法。有没有办法与一元谓词进行比较,如下所示:

#include <vector>
#include <iostream>
#include <algorithm>

//Create predicate for find_if
template<typename T>
struct eq {
    eq(const T _x) : x(x) { };

    //Does not work
    bool operator()(typedef std::vector<T>::iterator it) const {  //
        return *it <= x && x < *(++it);
    }
private:
    T x;
};

//Make vector
std::vector<double> vDouble;
vDouble.push_back(1.5);
vDouble.push_back(3.1);
vDouble.push_back(12.88);
vDouble.push_back(32.4);

double elemVal = *std::find_if(vNumeric.begin(), vNumeric.end(), eq<double>(13.0));

【问题讨论】:

  • 还有,@1201ProgramAlarm,std::adjacent_find不仅是为了寻找“连续相同的元素”,还可以寻找满足二元谓词条件的连续元素,这肯定是“元素相同”,但也可能是“两个元素满足任意二元谓词定义的某些条件”,提出的问题完全满足。
  • @1201ProgramAlarm:假设范围已排序。
  • 在您的 sn-p 中,向量已排序。这种情况总是如此,还是您对更通用的解决方案感兴趣?

标签: c++ vector unary-function


【解决方案1】:

使用std::adjacent_find,您可以这样做:

const auto x = 13.0;
auto it = std::adjacent_find(v.begin(), v.end(),
                             [x](double lhs, double rhs){ return lhs <= x && x < rhs; });

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多