Большинство алгоритмов STL фокусируются на одной конкретной задаче, они плохо сочетаются - вот почему мы получим диапазоны в первую очередь. До этого вам либо придется
- разделить ваше намерение на несколько вызовов алгоритма,
- написать конкретный алгоритм для вашего варианта использования
- продолжить придерживаться ручного цикла (в конце концов, они могут быть довольно читабельными) или
- использовать одну из доступных библиотек диапазонов.
Одно предложение для 2., конкретный алгоритм:
template <class InputIt, class Size, class OutputIt, class Pred, class Fct>
auto transform_n_if(InputIt first, InputIt last, Size count, OutputIt dest,
Pred pred, Fct transform)
{
Size n(0);
while (first != last && n !=count) {
if (pred(*first)) {
*dest++ = transform(*first);
++n;
}
++first;
}
return dest;
}
, который можно вызывать так:
std::vector<Point> coordinates(someSize);
std::vector<SomeClass> filtered;
transform_n_if(coordinates.cbegin(), coordinates.cend(), 42, std::back_inserter(filtered),
[](const Point& p){ return /* your condition here... */ true; },
[](const Point& p){ return /* your transformation here... */ SomeClass(p); });