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 не нужен.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность