std:: strided_slice
|
Определено в заголовочном файле
<mdspan>
|
||
|
template
<
class
OffsetType,
class
ExtentType,
class
StrideType
>
struct strided_slice ; |
(начиная с C++26) | |
Каждая специализация
strided_slice
представляет собой спецификатор среза, используемый в
std::submdspan
для выбора подмножества элементов с использованием набора регулярно расположенных индексов в указанном измерении
std::mdspan
.
Каждый
strided_slice
объект
s
характеризуется тремя членами данных: индексом смещения
s.
offset
, размером
s.
extent
и шагом
s.
stride
.
При условии, что
s.
stride
больше нуля, количество выбранных индексов, обозначаемое как
N
, определяется выражением
1
+
(
s.
extent
-
1
)
/
s.
stride
, если
s.
extent
ненулевое, иначе
0
. Полуоткрытый интервал, из которого будут выбираться индексы, задаётся как
[
s.
offset
,
s.
offset
+
s.
extent
)
. Последовательность выбранных индексов формируется следующим образом:
s.
offset
, ..., s.
offset
+
(
N
-
1
)
*
s.
stride
.
Этот шаблон класса не имеет базовых классов или объявленных членов, кроме показанных ниже.
Содержание |
Параметры шаблона
| OffsetType | - | тип смещения |
| ExtentType | - | тип размера |
| StrideType | - | тип шага |
| Требования к типам | ||
|
-
|
||
Программа является некорректной, если требование к типу не удовлетворено.
Типы членов
| Тип члена | Определение |
offset_type
|
OffsetType
|
extent_type
|
ExtentType
|
stride_type
|
StrideType
|
Члены данных
| Название члена | Определение |
|
offset
|
начальный индекс типа
offset_type
(публичный объект-член) |
|
extent
|
значение типа
extent_type
добавляемое к offset для определения верхней границы индексов
(публичный объект-член) |
|
stride
|
значение приращения типа
stride_type
эквивалентное расстоянию между двумя индексами
(публичный объект-член) |
Все эти члены объявлены с атрибутом
[[
no_unique_address
]]
и имеют инициализаторы по умолчанию, где каждый элемент данных инициализируется значением.
Примечания
Каждая специализация
strided_slice
является агрегатным классом, который допускает
агрегатную инициализацию
(включая designated initialization) членов данных (например,
std
::
strided_slice
{
.
offset
=
2
, .
extent
=
10
, .
stride
=
3
}
).
Спецификация среза для
strided_slice
использует преимущество члена данных
extent
, в отличие от других спецификаций среза, которые используют
end
для указания верхнего граничного значения. Это связано с тем, что она может напрямую генерировать статический размер для подобласти
std::mdspan
, если оба
extent
и
stride
являются типами, удовлетворяющими
integral-constant-like
. Это позволяет эффективно извлекать подобласти со статическими размерами, комбинируя значения времени компиляции со значением времени выполнения
offset
.
Пример
#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("] извлечено из индексов ["); 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}); }
Вывод:
[A, B, C, D, E, F, G, H, I, J] извлечено из индексов [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [C, D, E, F, G, H, I, J, K, L] извлечено из индексов [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [A, B, C, D, E] извлечено из индексов [0, 1, 2, 3, 4] [C, D, E, F, G] извлечено из индексов [2, 3, 4, 5, 6] [A, C, E, G, I] извлечено из индексов [0, 2, 4, 6, 8] [C, F, I, L] извлечено из индексов [2, 5, 8, 11] [A, F, K] извлечено из индексов [0, 5, 10] [G, L, Q] извлечено из индексов [6, 11, 16]
Смотрите также
|
BLAS-подобный срез valarray: начальный индекс, длина, шаг
(класс) |
|
|
(C++26)
|
возвращает представление подмножества существующего
mdspan
(шаблон функции) |