Namespaces
Variants

std:: strided_slice

From cppreference.net
Определено в заголовочном файле <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 - тип шага
Требования к типам
-
Все параметры шаблона должны быть беззнаковыми или знаковыми целочисленными типами или должны удовлетворять integral-constant-like

Программа является некорректной, если требование к типу не удовлетворено.

Типы членов

Тип члена Определение
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
(шаблон функции)