Namespaces
Variants

std::span<T,Extent>:: subspan

From cppreference.net
template < std:: size_t Offset,

std:: size_t Count = std:: dynamic_extent >
constexpr std:: span < element_type, /* см. ниже */ >

subspan ( ) const ;
(1) (начиная с C++20)
constexpr std:: span < element_type, std:: dynamic_extent >

subspan ( size_type offset,

size_type count = std:: dynamic_extent ) const ;
(2) (начиная с C++20)

Получает подпредставление над некоторыми последовательными элементами этого диапазона, включаемые элементы определяются количеством элементов и смещением.

1) Количество элементов и смещение задаются в качестве аргументов шаблона, и подпредставление имеет динамическую протяженность только если и Count , и Offset являются std:: dynamic_extent .
  • Если Count является std:: dynamic_extent , подпредставление содержит все элементы, начиная с Offset -го .
  • В противном случае подпредставление содержит Count элементов, начиная с Offset -го .
Обозначим второй шаблонный аргумент возвращаемого типа как FinalExtent , он определяется как Count ! = std:: dynamic_extent
? Count
: ( Extent ! = std:: dynamic_extent
? Extent - Offset
: std:: dynamic_extent )
.
Если Offset <= Extent && ( Count == std:: dynamic_extent || Count <= Extent - Offset ) имеет значение false , программа является некорректной.

Если Offset <= size ( ) && ( Count == std:: dynamic_extent || Count <= size ( ) - Offset ) равно false , поведение не определено.

(до C++26)

Если Offset <= size ( ) && ( Count == std:: dynamic_extent || Count <= size ( ) - Offset ) равно false :

  • Если реализация является защищённой , происходит нарушение контракта . Более того, если обработчик нарушения контракта возвращает управление при семантике оценки "observe", поведение не определено.
  • Если реализация не является защищённой, поведение не определено.
(начиная с C++26)


2) Количество элементов и смещение передаются в качестве аргументов функции, и подпредставление всегда имеет динамическую протяжённость.
  • Если count равно std:: dynamic_extent , подпредставление содержит все элементы, начиная с offset -го .
  • В противном случае подпредставление содержит count элементов, начиная с offset -го .

Если offset <= size ( ) && ( count == std:: dynamic_extent || count <= size ( ) - offset ) равно false , поведение не определено.

(до C++26)

Если offset <= size ( ) && ( count == std:: dynamic_extent || count <= size ( ) - offset ) равно false :

  • Если реализация является защищённой , происходит нарушение контракта . Более того, если обработчик нарушения контракта возвращает управление при семантике оценки "observe", поведение не определено.
  • Если реализация не является защищённой, поведение не определено.
(начиная с C++26)

Возвращаемое значение

1) std:: span < element_type, FinalExtent >
( data ( ) + Offset, Count ! = std:: dynamic_extent ? Count : size ( ) - Offset ) )
2) std:: span < element_type, std:: dynamic_extent >
( data ( ) + offset, count ! = std:: dynamic_extent ? count : size ( ) - offset ) )

Пример

#include <algorithm>
#include <cstdio>
#include <numeric>
#include <ranges>
#include <span>
void display(std::span<const char> abc)
{
    const auto columns{20U};
    const auto rows{abc.size() - columns + 1};
    for (auto offset{0U}; offset < rows; ++offset)
    {
        std::ranges::for_each(abc.subspan(offset, columns), std::putchar);
        std::puts("");
    }
}
int main()
{
    char abc[26];
    std::ranges::iota(abc, 'A');
    display(abc);
}

Вывод:

ABCDEFGHIJKLMNOPQRST
BCDEFGHIJKLMNOPQRSTU
CDEFGHIJKLMNOPQRSTUV
DEFGHIJKLMNOPQRSTUVW
EFGHIJKLMNOPQRSTUVWX
FGHIJKLMNOPQRSTUVWXY
GHIJKLMNOPQRSTUVWXYZ

Смотрите также

получает поддиапазон, состоящий из первых N элементов последовательности
(публичная функция-член)
получает поддиапазон, состоящий из последних N элементов последовательности
(публичная функция-член)