std::ranges::views::drop, std::ranges::drop_view
来自cppreference.com
| 在标头 <ranges> 定义
|
||
| template< ranges::view V > class drop_view : public ranges::view_interface<drop_view<V>> |
(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 起) | |
1) 由跳过首 N 个元素的底层元素序列构成的范围适配器。
2) 范围适配器对象。给定
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是 ranges::subrange 实现random_access_range和sized_range的特化且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 或 ranges::subrange 的实现random_access_range和sized_range的特化,其中U是
- 否则是 drop_view(e, f)。
drop_view 在底层范围 V 分别实现概念 contiguous_range、random_access_range、bidirectional_range、forward_range、input_range、common_range 及 sized_range 时实现该概念。
成员函数
| (C++20) |
构造 drop_view (公开成员函数) |
| (C++20) |
返回底层(适配的)视图的副本 (公开成员函数) |
| (C++20) |
返回指向起始的迭代器 (公开成员函数) |
| (C++20) |
返回指向末尾的迭代器或哨位 (公开成员函数) |
| (C++20) |
返回元素数,只要底层(适配的)范围满足 sized_range (公开成员函数) |
继承自 std::ranges::view_interface | |
| (C++20) |
返回视图是否为空。若视图满足 forward_range 则提供。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++23) |
返回指向范围起始的常量迭代器。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++23) |
返回对应于范围常量迭代器的哨位。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++20) |
返回派生视图是否为非空。若 ranges::empty 可应用于它则提供。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++20) |
返回派生视图的数据的地址。若视图的迭代器类型满足 contiguous_iterator 则提供。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++20) |
返回派生视图中的首元素。若视图满足 forward_range 则提供。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++20) |
返回派生视图中的末元素。若视图满足 bidirectional_range 与 common_range 则提供。 ( std::ranges::view_interface<D> 的公开成员函数) |
| (C++20) |
返回派生视图中的第 n 个元素。若视图满足 random_access_range 则提供。 ( std::ranges::view_interface<D> 的公开成员函数) |
推导指引
辅助模板
| template<class T> inline constexpr bool enable_borrowed_range<std::ranges::drop_view<T>> = |
(C++20 起) | |
std::ranges::enable_borrowed_range 的此特化使 drop_view 在底层视图满足 borrowed_range 时满足它。
示例
运行此代码
#include <iostream> #include <ranges> int main() { const auto nums = {1, 2, 3, 4, 5, 6, 7, 8, 9}; for (int i : nums | std::views::drop(2)) std::cout << i << ' '; std::cout << '\n'; for (int i : std::views::iota(1, 10) | std::views::drop(2)) std::cout << i << ' '; std::cout << '\n'; for (int i : std::ranges::drop_view{nums, 2}) std::cout << i << ' '; std::cout << '\n'; }
输出:
3 4 5 6 7 8 9 3 4 5 6 7 8 9 3 4 5 6 7 8 9
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3407 | C++20 | views::drop 有时无法构造具大小随机访问范围
|
调整构造使之始终合法 |
| LWG 3494 | C++20 | drop_view 决不是 borrowed_range
|
在底层范围是 borrowed_range 时它是
|
参阅
由另一 view 跳过元素的起始序列,直至首个谓词返回 false 的元素组成的 view (类模板) (范围适配器对象) |