Изменения в новых версиях / C++20

#include <algorithm>
#include <iostream>
#include <iterator>
#include <ranges>
#include <vector>

// *** before: ***
void oldWay() {
    std::vector<int> v{123456};

    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{123456};

    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(15) | std::views::reverse)
        std::cout << n << " ";
    std::cout << "\n";
}

int main() {
    oldWay();
    newWay();
}