std::span subspan() 方法
- 自 C++20 起
// (1) Const version only
template< std::size_t Offset,
std::size_t Count = std::dynamic_extent >
constexpr std::span<element_type, E /* see below */> subspan() const;
// (2) Const version only
constexpr std::span<element_type, std::dynamic_extent>
subspan( size_type Offset,
size_type Count = std::dynamic_extent ) const;
获取一个 span,它是此 span 从偏移量 Offset
开始的 Count
个元素的视图。
如果 Count
是 std::dynamic_extent
,则子 span 中的元素数量为 size() - offset
(即,它在 *this
的末尾结束)。
由 **(1)** 返回的 span 的范围 E
确定如下
- 如果
Count
不是 std::dynamic_extent -Count
; - 否则,如果
Extent
不是std::dynamic_extent
-Extent - Offset
; - 否则 -
std::dynamic_extent
。
重要
**(1)** 格式错误
如果Offset > Extent
,或Count
不是std::dynamic_extent
且Count > Extent - Offset
。
未定义行为
行为未定义
如果Offset
或 Count
超出范围。这发生在以下情况:
Offset
大于size()
,或Count
不是std::dynamic_extent
且Count
大于size() - Offset
参数
- (2)
Count
- 要构成 span 的元素数量Offset
- 开始偏移量
返回值
一个 span s
,它是 *this
的子 span Count
个元素的视图,具有以下属性:
s.data() == this->data() + Offset
和- 如果
Count
是std::dynamic_extent
s.size() == this->size() - Offset
- 否则
s.size() == Count
复杂度
常数 - O(1)。
异常
(无)
示例
Main.cpp
#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::putchar('\n');
}
}
int main()
{
char abc[26];
std::iota(std::begin(abc), std::end(abc), 'A');
display(abc);
}
输出
ABCDEFGHIJKLMNOPQRST
BCDEFGHIJKLMNOPQRSTU
CDEFGHIJKLMNOPQRSTUV
DEFGHIJKLMNOPQRSTUVW
EFGHIJKLMNOPQRSTUVWX
FGHIJKLMNOPQRSTUVWXY
GHIJKLMNOPQRSTUVWXYZ