C++23stlexpert
std::ranges::stride_view (C++23 Addition)
C++23 · Completing Modern · Compiler flag: -std=c++23
Explanation
View that yields every nth element from a range.
Real-World Scenario
Sample every nth frame in a video analysis.
Quick Snippet
snippet.cpp
#include <ranges> auto sv = std::ranges::stride_view(vec, 2);Full Example
ranges_stride_view.cpp
// CodeNebula - C++23 Example: std::ranges::stride_view
// Compile: g++ -std=c++23 -Wall -Wextra -o example ranges_stride_view.cpp
// Note: Requires GCC 13+ / Clang 17+
// std::ranges::stride_view takes every Nth element from a range. It advances
// through the underlying range by the given stride, producing a view that
// includes elements at positions 0, N, 2N, 3N, etc.
#include <iostream>
#include <ranges>
#include <vector>
#include <string>
int main() {
std::vector<int> data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// Take every 2nd element
std::cout << "=== Every 2nd element (stride 2) ===" << std::endl;
for (auto val : data | std::views::stride(2)) {
std::cout << " " << val;
}
std::cout << std::endl;
// Take every 3rd element
std::cout << "\n=== Every 3rd element (stride 3) ===" << std::endl;
for (auto val : data | std::views::stride(3)) {
std::cout << " " << val;
}
std::cout << std::endl;
// Practical: downsample a signal
std::vector<double> signal = {1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5};
std::cout << "\n=== Downsampled signal (every 3rd sample) ===" << std::endl;
for (auto val : signal | std::views::stride(3)) {
std::cout << " " << val << std::endl;
}
// Combine stride with other views
std::cout << "\n=== Even-indexed elements, squared ===" << std::endl;
for (auto val : data | std::views::stride(2)
| std::views::transform([](int x) { return x * x; })) {
std::cout << " " << val;
}
std::cout << std::endl;
// Interleave columns: get column 0 and column 1 from flat 2D data
// Data represents a 4x3 matrix stored row-major
std::vector<int> matrix = {10, 20, 30,
40, 50, 60,
70, 80, 90,
100, 110, 120};
int cols = 3;
std::cout << "\n=== Extract column 0 from 4x3 matrix ===" << std::endl;
for (auto val : matrix | std::views::drop(0) | std::views::stride(cols)) {
std::cout << " " << val;
}
std::cout << std::endl;
std::cout << "\n=== Extract column 1 from 4x3 matrix ===" << std::endl;
for (auto val : matrix | std::views::drop(1) | std::views::stride(cols)) {
std::cout << " " << val;
}
std::cout << std::endl;
return 0;
}
// Expected output:
// === Every 2nd element (stride 2) ===
// 0 2 4 6 8
//
// === Every 3rd element (stride 3) ===
// 0 3 6 9
//
// === Downsampled signal (every 3rd sample) ===
// 1
// 2.5
// 4
//
// === Even-indexed elements, squared ===
// 0 4 16 36 64
//
// === Extract column 0 from 4x3 matrix ===
// 10 40 70 100
//
// === Extract column 1 from 4x3 matrix ===
// 20 50 80 110
Run command
g++ -std=c++23 -Wall -Wextra -o example ranges_stride_view.cpp