std::span<T,Extent>::subspan
来自cppreference.com
template<std::size_t Offset, std::size_t Count =std::dynamic_extent> | (1) | (C++20 起) |
constexprstd::span<element_type, std::dynamic_extent> subspan( size_type Offset, | (2) | (C++20 起) |
获得此 span 的若干连续元素上的子视图,根据元素个数和偏移确定要包含的元素。
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)。
? 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))
(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))
(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 个元素组成的子段 (公开成员函数) |