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

来自cppreference.com
< cpp‎ | container‎ | span
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) 元素个数和偏移由模板实参提供,并且子视图只有在 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<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 个元素组成的子段
(公开成员函数) [编辑]