std::views::chunk_by — split range into chunks by predicate.
1#include <ranges>23std::vector<int> v = {1, 1, 2, 2, 2, 3, 1, 1};45// Chunk by equality6auto chunks = v | std::views::chunk_by(std::ranges::equal_to{});7for (auto chunk : chunks) {8 for (int x : chunk) {9 std::cout << x << " ";10 }11 std::cout << "| ";12}13// Output: 1 1 | 2 2 2 | 3 | 1 1 |1415// Chunk by predicate16std::vector<int> v2 = {1, 3, 5, 2, 4, 6, 7, 9};17auto chunks2 = v2 | std::views::chunk_by([](int a, int b) {18 return (a % 2) == (b % 2); // Same parity19});20for (auto chunk : chunks2) {21 std::cout << "[";22 for (size_t i = 0; i < chunk.size(); i++) {23 if (i > 0) std::cout << ", ";24 std::cout << chunk[i];25 }26 std::cout << "] ";27}28// Output: [1, 3, 5] [2, 4, 6] [7, 9]2930// Lazy evaluation31auto first_chunk = chunks2 | std::views::take(1);
Use cases: