std::ranges:: views:: drop, std::ranges:: drop_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
view
V
>
class
drop_view
|
(1) | (C++20 起) |
|
namespace
views
{
inline
constexpr
/* 未指定 */
drop
=
/* 未指定 */
;
|
(2) | (C++20 起) |
|
调用签名
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* 见下文 */
|
(C++20 起) | |
|
template
<
class
DifferenceType
>
constexpr /* 范围适配器闭包 */ drop ( DifferenceType && count ) ; |
(C++20 起) | |
T
为
std::
remove_cvref_t
<
decltype
(
(
e
)
)
>
且
D
为
ranges::
range_difference_t
<
decltype
(
(
e
)
)
>
,表达式
views
::
drop
(
e, f
)
在表达式等价性上等同于:
-
(
(
void
)
f,
decay-copy ( e ) ) ,若T为 ranges::empty_view ,除了 e 和 f 的求值顺序不确定; -
否则为
T
(
ranges::
begin
(
e
)
+
inc,
ranges::
end
(
e
)
,
/*to-unsigned-like*/ ( ranges:: distance ( e ) - inc ) ) ,若T是同时满足random_access_range和sized_range的 ranges:: subrange 特化,且T需要存储大小(详见 ranges::subrange::subrange() ),其中 inc 为 std:: min < D > ( ranges:: distance ( e ) , f ) ; -
否则为
U
(
ranges::
begin
(
e
)
+
inc,
ranges::
end
(
e
)
)
,若
T是 std:: span 、 std::basic_string_view 、 ranges:: iota_view 或同时满足random_access_range和sized_range的 ranges:: subrange 特化,其中U为
-
-
std::
span
<
typename
T
::
element_type
>
,若
T是 std:: span 的特化; -
否则为
T;
-
std::
span
<
typename
T
::
element_type
>
,若
|
(C++23 起) |
- 否则为 drop_view ( e, f ) 。
drop_view
在底层视图
V
满足相应概念时,实现了以下概念的建模:
contiguous_range
、
random_access_range
、
bidirectional_range
、
forward_range
、
input_range
、
common_range
以及
sized_range
。
目录 |
数据成员
| 成员 | 描述 |
V
base_
(私有)
|
底层视图
( 仅用于说明的成员对象* ) |
ranges::
range_difference_t
<
V
>
count_
(私有)
|
要跳过的元素数量
( 仅用于说明的成员对象* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
cache_
(私有)
(仅当
V
满足
forward_range
但不满足
random_access_range
和
sized_range
时存在)
|
缓存对
begin()
调用结果的对象
( 仅用于说明的成员对象* ) |
成员函数
构造一个
drop_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>
的公开成员函数)
|
|
推导指引
辅助模板
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
drop_view
<
T
>>
=
|
(C++20 起) | |
此
ranges::enable_borrowed_range
的特化使得当底层视图满足
borrowed_range
时,
drop_view
也满足
borrowed_range
。
示例
#include <initializer_list> #include <iostream> #include <ranges> int main() { const auto nums = {1, 2, 3, 4, 5, 6, 7}; std::cout << "丢弃 " << 2 << ": "; for (int i : std::ranges::drop_view{nums, 2}) std::cout << i << ' '; std::cout << '\n'; std::cout << "丢弃 " << 3 << ": "; for (int i : nums | std::views::drop(3)) std::cout << i << ' '; std::cout << '\n'; std::cout << "丢弃 " << 4 << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(4)) std::cout << i << ' '; std::cout << '\n'; // 注意:丢弃超过元素数量是安全的: for (int dp : {5, 6, 7, 890, 100500}) { std::cout << "丢弃 " << dp << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(dp)) std::cout << i << ' '; std::cout << '\n'; } }
输出:
丢弃 2: 3 4 5 6 7 丢弃 3: 4 5 6 7 丢弃 4: 5 6 7 丢弃 5: 6 7 丢弃 6: 7 丢弃 7: 丢弃 890: 丢弃 100500:
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 修正后行为 |
|---|---|---|---|
| LWG 3407 | C++20 |
views::drop
有时无法
构造大小确定的随机访问范围 |
调整构造方式
使其始终有效 |
| LWG 3494 | C++20 |
drop_view
从未是
borrowed_range
|
当底层视图是
borrowed_range
时
它也是
borrowed_range
|
参见
一个由另一个
view
的元素组成的
view
,跳过元素的初始子序列直到首个谓词返回
false
的元素
(类模板) (范围适配器对象) |