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

来自cppreference.com
< cpp‎ | container‎ | span
template<std::size_t Offset,

          std::size_t Count =std::dynamic_extent>
constexprstd::span<element_type, /* 见下文 */>

    subspan()const;
(1) (C++20 起)
constexprstd::span<element_type, std::dynamic_extent>

    subspan( size_type Offset,

             size_type Count =std::dynamic_extent)const;
(2) (C++20 起)

获得此 span 的若干连续元素上的子视图,根据元素个数和偏移确定要包含的元素。

1) 元素个数和偏移由模板实参提供,并且子视图只有在 CountOffset 都是 std::dynamic_extent 时才拥有动态长度。
  • 如果 Countstd::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) 元素个数和偏移由函数实参提供,并且子视图始终拥有动态长度。
  • 如果 countstd::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<constchar> abc){constauto columns{20U};constauto 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 个元素组成的子段
(公开成员函数)[编辑]
close