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 番目から含みます。
戻り値型の第2テンプレート引数を FinalExtent と表記する。これは以下のように定義される: Count ! = std:: dynamic_extent
? Count
: ( Extent ! = std:: dynamic_extent
? Extent - Offset
: std:: dynamic_extent )
Offset 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 番目 から始まる全ての要素を含みます。
  • それ以外の場合、サブビューは offset 番目 から始まる count 個の要素を含みます。

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 個の要素からなる部分スパンを取得する
(public member function)
シーケンスの最後の N 個の要素からなる部分スパンを取得する
(public member function)