std:: strided_slice
Defined in header
<mdspan>
|
||
template
<
class
OffsetType,
class
ExtentType,
class
StrideType
>
struct strided_slice ; |
(since C++26) | |
An instance of every specialization of
strided_slice
is a slice specifier used in
std::submdspan
to select a subset of elements using a set of regularly spaced indices at a specified dimension in
std::mdspan
.
Each
strided_slice
object
s
is characterized by three data members: the offset index
s.
offset
, the extent
s.
extent
, and the stride
s.
stride
.
Given that
s.
stride
is greater than zero, the number of selected indices denoted by
N
is determined by
1
+
(
s.
extent
-
1
)
/
s.
stride
if
s.
extent
is nonzero, otherwise
0
. The half-open interval from which indices will be selected is given by
[
s.
offset
,
s.
offset
+
s.
extent
)
. The sequence of selected indices is produced as follows:
s.
offset
, ..., s.
offset
+
(
N
-
1
)
*
s.
stride
.
This class template has no base classes or declared members other than those shown below.
Template parameters
OffsetType | - | the type of offset |
ExtentType | - | the type of extent |
StrideType | - | the type of stride |
Type requirements | ||
-
|
The program is ill-formed if the type requirement is not satisfied.
Member types
Member type | Definition |
offset_type
|
OffsetType
|
extent_type
|
ExtentType
|
stride_type
|
StrideType
|
Data members
Member name | Definition |
offset
|
a starting index of type
offset_type
(public member object) |
extent
|
a value of type
extent_type
added to offset used to define the upper bound of indices
(public member object) |
stride
|
an increment value of type
stride_type
which is equivalent to the distance between two indices
(public member object) |
All these members are declared with
[[
no_unique_address
]]
attribute and have default member initializers where each data member is value initialized.
Notes
Every specialization of
strided_slice
is an aggregate class which allows
aggregate initialization
(including designated initialization) of data members (for instance,
std
::
strided_slice
{
.
offset
=
2
, .
extent
=
10
, .
stride
=
3
}
).
The slice specification of
strided_slice
takes advantage of the data member
extent
, as opposed to other slice specifications that use
end
to indicate the upper bound value. This is because it can directly generate a static extent for subview of
std::mdspan
if both
extent
and
stride
are of types that satisfy
integral-constant-like
. This enables efficient extraction of subviews with static extents by mixing compile time values with a runtime value of
offset
.
Example
#include <mdspan> #include <print> template <typename View, typename O = int, typename E = int, typename S = int> requires (View::extents_type::rank() == 1) void print_sliced_view(View v, std::strided_slice<O, E, S> s) { using index_type = View::index_type; auto subview = std::submdspan(v, s); const auto& submap = subview.mapping(); std::print("["); bool uses_comma = false; for (index_type i = 0; i != subview.extent(0); ++i) { if (uses_comma) std::print(", "); std::print("{}", subview[i]); uses_comma = true; } uses_comma = false; std::print("] extracted from indices ["); for (index_type i = 0; i != subview.extent(0); ++i) { if (uses_comma) std::print(", "); std::print("{}", submap(i) + s.offset); uses_comma = true; } std::println("]"); } int main() { static constexpr char letters[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; constexpr std::mdspan md(letters, 26); print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 1}); print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 1}); print_sliced_view(md, {.offset = 0, .extent = 5, .stride = 1}); print_sliced_view(md, {.offset = 2, .extent = 5, .stride = 1}); print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 2}); print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 3}); print_sliced_view(md, {.offset = 0, .extent = 15, .stride = 5}); print_sliced_view(md, {.offset = 6, .extent = 15, .stride = 5}); }
Output:
[A, B, C, D, E, F, G, H, I, J] extracted from indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [C, D, E, F, G, H, I, J, K, L] extracted from indices [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [A, B, C, D, E] extracted from indices [0, 1, 2, 3, 4] [C, D, E, F, G] extracted from indices [2, 3, 4, 5, 6] [A, C, E, G, I] extracted from indices [0, 2, 4, 6, 8] [C, F, I, L] extracted from indices [2, 5, 8, 11] [A, F, K] extracted from indices [0, 5, 10] [G, L, Q] extracted from indices [6, 11, 16]
See also
BLAS-like slice of a valarray: starting index, length, stride
(class) |
|
(C++26)
|
returns a view of a subset of an existing
mdspan
(function template) |