🥳 Генераторы: views::iota и views::repeat

🥳 Генераторы: 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 не нужен.
Просмотры: 203
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти