通过元素的功能搜索upper_bound

时间:2019-03-17 11:10:28

标签: c++ c++-standard-library

让我们说a具有一个A类,可以将其评估为整数。

我们得到A的向量,该向量按evaluate()的值排序。

如何找到评估值的上限?

我试过了,但是没有编译。

class A;
int evaluate(const A& a);
// ...
vector<A>::iterator foo(vector<A>& v, int k)
{
    return upper_bound(v.begin(), v.end(), k,
        [](const A& a, int k)
        {
            return evaluate(a) < k;
        }
    );
}

2 个答案:

答案 0 :(得分:1)

虽然其他用户正确指出了问题(例如@StoryTeller“您在lambda中的参数顺序错误”),但请允许我放下一段在我的计算机上编译的代码,以供其他使用观众的参考。

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

class A
{
public:
    int data;
    A(int data) : data(data) {}
};

int evaluate(const A & a)
{
    return a.data;
}

std::vector<A>::iterator foo(std::vector<A> & v, int k)
{
    return std::upper_bound(v.begin(), v.end(), k,
           [](int k, A & a) { return evaluate(a) > k; });   // first argument always val
}

int main()
{
    std::vector<A> vec {36, 42, 57};
    std::cout << foo(vec, 42) - vec.begin() << std::endl;   // 2
}

答案 1 :(得分:0)

根据C ++ 17标准中的[upper.bound]

  

...符合以下条件:...或comp(value, *j) == false

这意味着您将以第一个参数为您传递的comp来调用value(您的谓词);第二个参数是取消引用的迭代器。

换句话说,您可能希望谓词具有以下类型:

bool (int, const A&)