Путь, который приходит на ум, состоит в том, чтобы разбить его на два этапа. В этом случае std::iota
заполнит вектор входами (0, 1, 2 и т. Д. c). Затем std::transform
выполнит вашу функцию square
для каждого из элементов и заменит их в векторе.
int main()
{
auto square = [] (int n) {return n*n;};
std::vector<int> v(5, 0);
std::iota(v.begin(), v.end(), 0);
std::transform(v.begin(), v.end(), v.begin(), square);
for (int i : v)
std::cout << i << ' ';
}
Выход
0 1 4 9 16
Честно говоря, такие вещи будут намного более краткими и упрощенными, как только диапазоны доступны, C ++ 20 рабочий пример
int main()
{
auto square = [] (int n) {return n*n;};
for (int i : std::views::iota(0, 5) | std::views::transform(square))
std::cout << i << ' ';
}