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

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}}
