请注意,本文尚未完成!您可以通过编辑此文档页面来提供帮助。
Span 类参考
概述
- 简化
- 详细
template< class T, /* ... */ >
class span;
template<
class T,
std::size_t Extent = std::dynamic_extent
> class span;
std::span
是一个动态或静态连续容器的视图。
内存
本节需要改进。您可以通过编辑此文档页面来帮助我们。
技术细节
技术细节
类模板 span 描述了一个对象,该对象可以引用一个连续的对象序列,序列的第一个元素位于位置零。
span 可以拥有
-
静态范围,在这种情况下
- 序列中的元素数量在编译时已知并编码在类型中
- 典型的实现可能只有一个成员 - 指向
T
的指针
-
动态范围,在这种情况下
- 元素数量在编译时未知,并且可以在运行时更改
- 典型的实现包含两个成员 - 指向
T
的指针和大小
命名要求
std::span
满足以下要求
-
可平凡复制 (TriviallyCopyable) (C++23 起)
-
注意
即使在 C++23 中引入正式要求之前,
std::span
的特化在所有现有实现中都已经是可以平凡复制的类型。
-
特性测试宏
本节需要改进。您可以通过编辑此文档页面来帮助我们。
std::span
定义于 | span |
模板参数
pub | T | 元素的类型。 |
pub | Extent | 容器中的元素数量,如果为动态则为 |
类型名称
pub | element_type | T |
pub | value_type | std::remove_cv_t<T> |
pub | size_type | 无符号整型(通常是std::size_t ) |
pub | difference_type | 有符号整型(通常是std::ptrdiff_t ) |
pub | pointer | T* |
pub | const_pointer | const T* |
pub | reference | T& |
pub | const_reference | const T& |
pub | iterator | 实现定义的 |
pub | reverse_iterator | std::reverse_iterator<iterator> |
成员函数
pub | (构造函数) | 构造一个 span。 |
pub | (析构函数) | 销毁 span。 |
pub | operator= | 将值分配给容器。 |
元素访问
pub | front | 返回第一个元素。 |
pub | 末尾 | 返回最后一个元素。 |
pub | operator[] | 访问指定元素。 |
pub | 数据 | 返回指向底层数组第一个元素的指针。 |
迭代器
pub | begin | 返回指向起始元素的 |
pub | end | 返回指向结束元素的 |
pub | rbegin | 返回一个反向 |
pub | rend | 返回一个反向 |
观察器
pub | size | 返回元素数量。 |
pub | size_bytes | 返回最大可能的元素数量。 |
pub | empty | 如果 span 为空,则返回 |
子视图
pub | first | 清空内容。 |
pub | last | 插入元素。 |
pub | subspan | 移除元素。 |
常量
static constexpr std::size_t extent = Extent;
非成员函数
pub | as_bytes as_writable_bytes | 按字典顺序比较 span 中的值。 |
非成员常量
pub | std::dynamic_extent | 一个 |
辅助模板
- 自 C++20 起
template<class T, std::size_t Extent>
inline constexpr bool ranges::enable_borrowed_range<std::span<T, Extent>> = true;
此 ranges::enable_borrowed_range
特化使 span
满足 borrowed_range
。
- 自 C++20 起
template<class T, std::size_t Extent>
inline constexpr bool ranges::enable_view<std::span<T, Extent>> = true;
此 ranges::enable_view
特化使 span
满足 view
。
推导指南 (C++17 起)
点击展开
推导指南
// (1)
template <class It, class EndOrSize>
span(It, EndOrSize) -> span<std::remove_reference_t<std::iter_reference_t<It>>>;
(1)
允许从迭代器-哨兵对推导元素类型。
// (2)
template<class T, std::size_t N>
span(T (&)[N]) -> span<T, N>;
// (3)
template<class T, std::size_t N>
span(std::array<T, N>&) -> span<T, N>;
// (4)
template<class T, std::size_t N>
span(const std::array<T, N>&) -> span<const T, N>;
(2 - 4)
允许从内置数组和std::array
推导静态范围
// (5)
template<class R>
span(R&&) -> span<std::remove_reference_t<std::ranges::range_reference_t<R>>>;
(5)
允许从范围推导元素类型。
重载决议
为了使任何推导指南参与重载决议,必须满足以下要求
- 对于
(1)
,It
满足contiguous_iterator
- 对于
(5)
,R
满足contiguous_range
示例
本节需要改进。您可以通过编辑此文档页面来帮助我们。