Ежедневный бит (е) C ++ # 180, цикл range-for как замена необработанных циклов.

Цикл на основе диапазона был введен в C++11; однако только с введением представлений C++20 он может заменить почти все экземпляры необработанных циклов for.

#include <algorithm>
#include <vector>
#include <ranges>

// C++11: iterate over values in an initializer list
for (auto v : {1, 1, 2, 3, 5, 8, 13}) {}

// C++20: iterate over [1,10), values 1..9
for (auto v : std::views::iota(1, 10)) {}

// C++20: downward iteration 5..-5
for (auto v : std::views::iota(-5, 6) | std::views::reverse) {}

std::vector<int> data{1, 2, 3, 4, 5, 6, 7, 8, 9};
auto it = std::ranges::lower_bound(data, 5);

// C++20: iterating over sub-range, 1..4
for (auto v : std::ranges::subrange(data.begin(), it)) {}
// C++20: iterating over sub-range, 5..9
for (auto v : std::ranges::subrange(it, data.end())) {}

// C++23: nested loop replacement
// iterate over i==[0,5), j==[0,5)
for (auto [i,j] : std::views::cartesian_product(
                    std::views::iota(0,5),
                    std::views::iota(0,5))) {}

Откройте пример в Compiler Explorer.