std::ranges:: views:: take, std::ranges:: take_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
view
V
>
class
take_view
|
(1) | (C++20 起) |
|
namespace
views
{
inline
constexpr
/* 未指定 */
take
=
/* 未指定 */
;
|
(2) | (C++20 起) |
|
调用签名
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* 见下文 */
|
(C++20 起) | |
|
template
<
class
DifferenceType
>
constexpr /* 范围适配器闭包 */ take ( DifferenceType && count ) ; |
(C++20 起) | |
view
元素视图。
views::take
是一个
范围适配器对象
。表达式
views
::
take
(
e, f
)
的结果是一个视图,表示来自
e
的前
f
个元素。其结果不一定是
take_view
。
views
::
take
(
e, f
)
是
表达式等价
于(其中
T
是
std::
remove_cvref_t
<
decltype
(
(
e
)
)
>
且
D
是
ranges::
range_difference_t
<
decltype
(
(
e
)
)
>
):
-
(
(
void
)
f,
decay-copy ( e ) ) ,如果T是 ranges:: empty_view ,除了 e 和 f 的求值顺序不确定; -
U
(
ranges::
begin
(
e
)
,
ranges::
begin
(
e
)
+
std::
min
<
D
>
(
ranges::
distance
(
e
)
, f
)
)
,如果
T是 std:: span 、 std::basic_string_view 或 ranges:: subrange 的特化,且同时满足random_access_range和sized_range,其中U是
-
-
std::
span
<
typename
T
::
element_type
>
,如果
T是 std:: span 的特化; -
T,如果T是 std::basic_string_view 的特化; -
ranges::
subrange
<
ranges::
iterator_t
<
T
>>
,如果
T是 ranges:: subrange 的特化;
-
std::
span
<
typename
T
::
element_type
>
,如果
-
ranges::
iota_view
(
*
ranges::
begin
(
e
)
,
* ( ranges:: begin ( e ) + std:: min < D > ( ranges:: distance ( e ) , f ) ) ) ,如果T是 ranges:: iota_view 的特化,且同时满足random_access_range和sized_range;
|
(C++23 起) |
- 否则, take_view ( e, f ) 。
take_view
在底层视图
V
满足相应概念时,实现以下概念:
contiguous_range
、
random_access_range
、
bidirectional_range
、
forward_range
、
input_range
以及
sized_range
。当底层视图
V
同时满足
random_access_range
和
sized_range
时,它实现
common_range
概念。
目录 |
数据成员
| 成员 | 描述 |
V
base_
|
底层视图
( 仅用于说明的成员对象* ) |
ranges::
range_difference_t
<
V
>
count_
|
要获取的元素数量
( 仅用于说明的成员对象* ) |
成员函数
构造一个
take_view
(公开成员函数) |
|
|
返回底层(适配的)视图的副本
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
返回元素数量,仅当底层(适配的)范围满足
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>
的公开成员函数)
|
|
获取派生视图数据的地址,仅当其迭代器类型满足
contiguous_iterator
时提供
(
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++20)
|
哨兵类型
( 仅用于说明的成员类模板* ) |
辅助模板
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
take_view
<
T
>>
=
|
(C++20 起) | |
此
ranges::enable_borrowed_range
的特化使
take_view
在底层视图满足
borrowed_range
时同样满足该概念。
示例
#include <algorithm> #include <iostream> #include <ranges> int main() { namespace views = std::views; auto print = [](char x){ std::cout << x; }; for (const char nums[]{'1', '2', '3'}; int n : views::iota(0, 5)) { std::cout << "take(" << n << "): "; // 安全地仅获取最多 min(n, nums.size()) 个元素: std::ranges::for_each(nums | views::take(n), print); std::cout << '\n'; } }
输出:
take(0): take(1): 1 take(2): 12 take(3): 123 take(4): 123
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3407 | C++20 |
views::take
有时无法
构造大小确定的随机访问范围 |
调整结果类型使得
构造始终有效 |
| LWG 3494 | C++20 |
take_view
从未是
borrowed_range
|
当底层视图是
borrowed_range
时
它也是
borrowed_range
|
参见
|
(C++20)
|
通过迭代器和计数创建子范围
(定制点对象) |
由另一个
view
的初始元素组成的
view
,直到谓词首次返回
false
的元素为止
(类模板) (范围适配器对象) |
|
|
(C++20)
|
复制指定数量的元素到新位置
(算法函数对象) |