Я пытаюсь упростить рекурсивную функцию, которая получает итератор. Где-то в функции необходимо искать элемент, соответствующий данному условию, в диапазоне, идущем от итератора до конца вектора. Таким образом, я думал, что я мог бы использовать find_if
, как показано ниже:Получение итератора из элемента, переданного лямбда при использовании std :: find_if
typedef std::vector<Foo> FooVec;
FooVec v;
int f(FooVec::iterator it) {
/* ... */
auto it2 = std::find_if(it, end(v),
[](const Foo& foo) {
auto foo_it = /* obtain the corresponding iterator for foo. */
return f(foo_it) == 0;
});
/* ... */
}
Но лямбда-функция получает элемент, а не итератора к текущему элементу, так что я не могу легко назвать f
снова. Я мог бы найти foo
в v
, чтобы получить итератор, но это было бы неэффективно. В качестве альтернативы я мог бы просто использовать обычный цикл for
с итераторами. Но мне было интересно, есть ли возможность использовать find_if
в этой ситуации.
Неясно, что цель функции ф. –
Избавьтесь от глобальной переменной «v» (она может быть не глобальной, но использование аналогичной), и передайте это v прямо на вашу рекурсивную функцию (тогда вы можете захватить «v» в лямбда). –
Я чувствую, что это случай проблемы XY. – Julian