Заменить цикл for на std::find_if и лямбда

#c #boost #stl #c 17

#c #повысить #stl #c 17

Вопрос:

Рассмотрим этот код:

 int i{ -1 };
for(i=0; i<size;   i) if (predicate(i)) break;
bool found{ i < size };
 

Это должно быть просто заменить на std::find_if , но для этого нужен итератор для целых чисел в диапазоне от 0 до size-1 . (Эквивалент перечисляемого IEnumerable в C #.Диапазон (0, размер-1).)

Комментарии:

1. Вам нужны диапазоны C 20 или пользовательские итераторы.

2. Я не понимаю, как found здесь работает. Не i >= 0 будет истинным, когда цикл завершается, несмотря ни на что?

3. Часть инициализации в for() цикле происходит до проверки условия и выполнения тела, поэтому это невозможно, это i было бы отрицательно, и неясно, чего вы хотите достичь.

4. Тогда, пожалуйста, отредактируйте свой вопрос, чтобы сказать это. В нынешнем виде этот вопрос сбивает с толку будущих читателей.

Ответ №1:

Поскольку вы пометили свой вопрос boost тегом, я предполагаю boost::irange , что вместе с boost::find_if выполнит работу:

 boost::find_if(boost::irange(0, size - 1), predicate);