искать верхнюю_связь по функции элемента - PullRequest
1 голос
/ 17 марта 2019

Допустим, у нас есть класс 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 ]

1 голос
/ 17 марта 2019

В то время как другие пользователи правильно указали на проблему (например, «@StoryTeller неправильно указал аргументы в лямбда-аргументах»), пожалуйста, позвольте мне записать фрагмент кода, который компилируется на моей машине, для другихотзыв зрителей.

#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
}
0 голосов
/ 17 марта 2019

Согласно [upper.bound] в стандарте C ++ 17:

... выполняются следующие соответствующие условия: ... или comp(value, *j) == false.

Это означает, что вы получите вызовы comp (ваш предикат) с первым аргументом, который вы передали value;и второй аргумент - разыменованный итератор.

Другими словами, вы, вероятно, хотите, чтобы ваш предикат имел тип:

bool (int, const A&)
...