std::span<T,Extent>::subspan
来自cppreference.com
<tbody>
</tbody>
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 起) |
获得此 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)。
如果
Offset <= Extent && (Count == std::dynamic_extent || Count <= Extent - Offset) 是 false,那么程序非良构。|
如果 |
(C++26 前) |
|
如果 |
(C++26 起) |
2) 元素个数和偏移由函数实参提供,并且子视图始终拥有动态长度。
- 如果
count是std::dynamic_extent,那么子视图包含从第offset个元素开始的所有元素。 - 否则子视图包含从第
offset个元素开始的count个元素。
|
如果 |
(C++26 前) |
|
如果 |
(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 个元素组成的子段 (公开成员函数) |