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

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