🥳 Генераторы: views::iota и views::repeat — 25 мая 2026 г. в 07:26:31.435
🥳 Генераторы: views::iota и views::repeat Ranges умеют генерировать их на лету — без выделения памяти под вектор. Разберём два главных генератора. 🍕 views::iota — числовой диапазон Генерирует последовательность чисел в полуоткрытом интервале [start, end): // Числа от 0 до 9 for (int i : views::iota(0, 10)) { std::cout << i << " "; // 0 1 2 3 4 5 6 7 8 9 } Можно передать только одно значение — получится бесконечная последовательность: auto naturals = views::iota(1); // 1, 2, 3, 4, ... auto first_10 = naturals | views::take(10); ❗️ Бесконечный диапазон обязательно нужно ограничить — например, через views::take. 🌳 Индексированный обход (zip + iota) До появления views::enumerate пару (индекс, значение) получали через views::zip с iota: std::vector<std::string> fruits = {"яблоко", "банан", "вишня"}; for (auto [i, fruit] : views::zip(views::iota(0), fruits)) { std::cout << i << ": " << fruit << "\n"; } // 0: яблоко // 1: банан // 2: вишня В C++23 для этого есть views::enumerate — но zip + iota по-прежнему работает и даёт понять, как устроена индексация изнутри. 🍙 views::repeat — повторение значения (C++23) Генерирует бесконечный поток из одного и того же значения: for (int x : views::repeat(0) | views::take(5)) { std::cout << x << " "; // 0 0 0 0 0 } Или сразу с ограничением — передаём второй аргумент: for (auto s : views::repeat("hello", 3)) { std::cout << s << " "; // hello hello hello } ❗️ Форма с двумя аргументами появилась в C++23 и возвращает конечный диапазон — views::take не нужен.

