std::span<T,Extent>::subspan
来自cppreference.com
template< std::size_t Offset, std::size_t Count = std::dynamic_extent > |
(1) | (C++20 起) |
constexpr std::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<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 个元素组成的子段 (公开成员函数) |