Daily bit(e) C++. std::iota, std::views::iota

Добавлено 5 августа 2026 в 04:30

Daily bit(e) C++ 55, генерация ряда последовательных значений с помощью std::iota и std::views::iota.

Daily bit(e) C++

std::iota – это простой алгоритм, который генерирует последовательные значения путем многократного применения префиксного инкремента, начиная с начального значения.

Хотя базовый алгоритм std::iota довольно нишевый, лениво вычисляемый std::views::iota из C++20 является более полезной версией, особенно в сочетании с другими представлениями.

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

std::vector<int> data(5);
std::iota(data.begin(), data.end(), 42);
// data == {42, 43, 44, 45, 46}

// Один из удобных вариантов использования - создание «косвенного» контейнера.
std::vector<std::vector<int>::iterator> indirect(data.size());
std::iota(indirect.begin(), indirect.end(), data.begin());

// Полезно, когда обмен значениями обходится дорого или невозможен.
// Вместо этого мы можем манипулировать косвенным контейнером.
std::sort(indirect.begin(), indirect.end(), 
    [](auto& left, auto& right) {
        return *left > *right;
    });
// data == {42, 43, 44, 45, 46}
// indirect ~ {46, 45, 44, 43, 42}


auto view1 = std::views::iota(9,12);
// view1 = {9, 10, 11}

auto view2 = std::views::iota(42);
// view2 == {42, 43, ...}, бесконечное представление

// Бесконечное std::view::iota, упакованное с конечным диапазоном
// (std::views::zip из C++23)
auto view3 = std::views::zip(std::views::iota(1), data);
// view3 == {{1, 42}, {2, 43}, {3, 44}, {4, 45}, {5, 46}}

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование