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 个元素开始的所有元素。
  • 否则,子视图包含从第 Offset 个元素开始的 Count 个元素。
将返回类型的第二个模板参数记为 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

  • 若实现为 强化实现 ,则发生 契约违规 。此外,若契约违规处理程序在“观察”评估语义下返回,则行为未定义。
  • 若实现非强化实现,则行为未定义。
(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

  • 若实现为 强化实现 ,则发生 契约违规 。此外,若契约违规处理程序在“观察”求值语义下返回,则行为未定义。
  • 若实现非强化实现,则行为未定义。
(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 个元素组成的子区间
(公开成员函数)