std::ranges:: views:: stride, std::ranges:: stride_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
input_range
V
>
requires
ranges::
view
<
V
>
|
(1) | (C++23 起) |
|
namespace
views
{
inline
constexpr
/* 未指定 */
stride
=
/* 未指定 */
;
|
(2) | (C++23 起) |
|
调用签名
|
||
|
template
<
ranges::
viewable_range
R
>
constexpr ranges:: view auto stride ( R && r, ranges:: range_difference_t < R > n ) ; |
(C++23 起) | |
|
template
<
class
DifferenceType
>
constexpr /*范围适配器闭包*/ stride ( DifferenceType && n ) ; |
(C++23 起) | |
|
辅助模板
|
||
stride_view
是一种范围适配器,它接收一个
view
和数值
n
,并生成一个视图,该视图通过每次前进
n
个元素来包含原始视图的元素。这意味着生成视图的每个
m
th
元素对应原始视图的
(n * i)
th
元素(其中
i
为非负索引)。原始视图中“索引”不是
n
倍数的元素不会出现在生成视图中。
S
为原始视图的尺寸。则生成视图的尺寸为:
- ( S / n ) + ( S % n ? 1 : 0 ) ,当 S >= n 时;否则,
- 1 ,当 S > 0 时;否则,
- 0 ,此时生成的视图为空。
n
必须大于
0
,否则行为未定义。
stride_view
始终满足
input_range
概念,并且当被适配的
view
类型
V
满足相应概念时,也会满足
forward_range
、
bidirectional_range
、
random_access_range
和/或
sized_range
概念。
stride_view
<
V
>
在底层视图
V
满足
common_range
时同样满足该概念。
目录 |
数据成员
| 成员 | 描述 |
V
base_
|
底层视图
( 仅用于说明的成员对象* ) |
ranges::
range_difference_t
<
V
>
stride_
|
跨度对象(“步长”)
( 仅用于说明的成员对象* ) |
成员函数
构造
stride_view
(公开成员函数) |
|
|
(C++23)
|
返回存储的步长值
(公开成员函数) |
|
返回底层(适配的)视图的副本
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
返回元素数量,仅当底层(适配的)范围满足
sized_range
时提供
(公开成员函数) |
|
|
(C++26)
|
返回生成的
approximately_sized_range
的近似大小
(公开成员函数) |
继承自 std::ranges::view_interface |
|
返回派生视图是否为空,仅当它满足
sized_range
或
forward_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
|
(C++23)
|
返回指向范围起始位置的常量迭代器
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
(C++23)
|
返回范围常量迭代器的哨兵
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图是否非空,仅当
ranges::empty
适用于它时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的首元素,仅当它满足
forward_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的末元素,仅当它满足
bidirectional_range
和
common_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的第
n
个元素,仅当它满足
random_access_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
推导指引
嵌套类
|
(C++23)
|
迭代器类型
( 仅用于说明的成员类模板* ) |
辅助模板
|
template
<
class
V
>
constexpr
bool
ranges::
enable_borrowed_range
<
stride_view
<
V
>>
=
|
(自 C++23 起) | |
此
ranges::enable_borrowed_range
的特化使得
stride_view
在底层视图满足
borrowed_range
时同样满足该概念。
注释
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_ranges_stride
|
202207L
|
(C++23) |
std::ranges::stride_view
|
示例
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> using namespace std::literals; void print(std::ranges::viewable_range auto&& v, std::string_view separator = " ") { for (auto const& x : v) std::cout << x << separator; std::cout << '\n'; } int main() { print(std::views::iota(1, 13) | std::views::stride(3)); print(std::views::iota(1, 13) | std::views::stride(3) | std::views::reverse); print(std::views::iota(1, 13) | std::views::reverse | std::views::stride(3)); print("0x0!133713337*x//42/A$@"sv | std::views::stride(0B11) | std::views::transform([](char O) -> char { return 0100 | O; }), ""); }
输出:
1 4 7 10 10 7 4 1 12 9 6 3 password
参考文献
- C++23 标准 (ISO/IEC 14882:2024):
-
- 26.7.31 步幅视图 [range.stride]
参见
|
(C++23)
|
一个
view
,其第 M 个元素是另一个
view
中第 M 至 (M + N - 1) 个元素的
view
(类模板) (范围适配器对象) |
|
(C++23)
|
由另一个
view
元素组成的
N
大小非重叠连续块构成的
view
s
范围
(类模板) (范围适配器对象) |
由被适配视图相邻元素的引用元组构成的
view
(类模板) (范围适配器对象) |
|
由满足谓词的
range
元素构成的
view
(类模板) (范围适配器对象) |