#include <algorithm>
#include <iostream>
#include <iterator>
#include <ranges>
#include <vector>
// *** before: ***
void oldWay() {
std::vector<int> v{1, 2, 3, 4, 5, 6};
std::vector<int> even;
std::copy_if(v.begin(), v.end(), std::back_inserter(even),
[](int n) { return n % 2 == 0; });
std::vector<int> squares; // a second temporary vector
std::transform(even.begin(), even.end(), std::back_inserter(squares),
[](int n) { return n * n; });
for (int n : squares) std::cout << n << " ";
std::cout << "\n";
}
// *** in version C++20: ***
void newWay() {
std::vector<int> v{1, 2, 3, 4, 5, 6};
auto squares = v | std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * n; });
for (int n : squares) std::cout << n << " "; // computed on the way,
std::cout << "\n"; // nothing is copied
std::ranges::sort(v); // the container itself,
std::cout << std::ranges::count(v, 3) << "\n"; // no begin and end pair
for (int n : std::views::iota(1, 5) | std::views::reverse)
std::cout << n << " ";
std::cout << "\n";
}
int main() {
oldWay();
newWay();
}