Daily bit(e) C++. std::view::chunk

Добавлено 18 сентября 2026 в 04:22

Daily bit(e) C++ 108, std::views::chunk – представление из стандарта C++23, разбивающее диапазон на «куски» (chunks), то есть поддиапазоны, каждый из которых содержит заданное количество элементов.

Daily bit(e) C++

std::views::chunk из C++23 создает представление, состоящее из поддиапазонов, каждый из которых охватывает заданное количество элементов.

Если исходный диапазон невозможно разделить без остатка, последним элементом станет укороченный поддиапазон, содержащий оставшиеся элементы.

Это представление работает с входными диапазонами (input ranges) и предоставляет дополнительные возможности в зависимости от типа исходного диапазона (например, будет доступен operator[], если исходный диапазон поддерживает произвольный доступ).

#include <vector>
#include <ranges>
#include <iostream>
#include <utility>

void print_range(auto&& rng);

int main()
{
    std::vector<int> data{1,2,3,4,5,6,7,8,9};

    // Пройтись по кускам размером 4 (и одному куску размером 1)
    for (const auto& chunk : data | std::views::chunk(4)) 
    {
        print_range(chunk);
    }
    /* итерация по поддиапазонам:
    {1,2,3,4}
    {5,6,7,8}
    {9}
    */
    std::cout << '\n';

    auto view = data | std::views::chunk(4);
    auto second = view[1]; // OK
    // operator[] предоставляется, если исходный
    // диапазон поддерживает произвольный доступ
    // second == {5,6,7,8}
    print_range(second);
    std::cout << '\n';

    auto last = view.back(); // OK
    // back() предоставляется, если исходный
    // диапазон двунаправленный
    // last == {9}
    print_range(last);
    std::cout << '\n';

    std::vector<int> cube(27,0);
    // Может использоваться для итерации по многомерным данным,
    // хранящимся в виде одномерного массива.
    for (const auto &slice : cube | std::views::chunk(3*3)) 
    {
        // пройтись по фрагментам 3x3
        for (const auto &row : slice | std::views::chunk(3)) 
        {
            // пройтись по строкам из 3элементов
            print_range(row);
        }
        std::cout << '\n';
    }
}

void print_range(auto&& rng) 
{
    std::cout << "{";
    std::string delim;
    for (int v : rng)
        std::cout << std::exchange(delim,", ") << v;
    std::cout << "}\n";
}

Пример на Compiler Explorer

Теги

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