# std::ranges::views::drop_while, std::ranges::drop_while_view

< cpp‎ | ranges

定义于头文件 `<ranges>` |  |
template< ranges::view V, class Pred > requires ranges::input_range<V> && std::is_object_v<Pred> && std::indirect_unary_predicate<const Pred, ranges::iterator_t<V>> class drop_while_view : public ranges::view_interface<drop_while_view<V, Pred>> | (1) | (C++20 起)
namespace views { inline constexpr /*unspecified*/ drop_while = /*unspecified*/; } | (2) | (C++20 起)

1) 表示来自底层序列，始于首个谓词对其返回 false 的元素的 `view` 。
2) 范围适配器对象。表达式 views::drop_while(e, f) 对任何适合的子表达式 e 与 f 表达式等价于 drop_while_view(e, f) 。

drop_while_view 在底层视图 V 实现 `contiguous_range`、 `random_access_range`、 `bidirectional_range`、 `forward_range`、 `input_range` 和 `common_range` 时实现该概念。若 ranges::forward_range<V> 与 std::sized_sentinel_for<ranges::sentinel_t<D>, ranges::iterator_t<D>> 均被实现则它亦实现 `sized_range` 。

### 表达式等价

表达式 e 表达式等价于表达式 f ，若 e 与 f 拥有相同效果，均为潜在抛出或均非潜在抛出（即 noexcept(e) == noexcept(f) ），且均为常量子表达式或均非常量子表达式。

### 成员函数

(构造函数) (C++20) | 构造 `drop_while_view` (公开成员函数)
base (C++20) | 返回底层（适配的）视图的副本 (公开成员函数)
pred (C++20) | 返回到存储的谓词的引用 (公开成员函数)
begin (C++20) | 返回指向起始的迭代器 (公开成员函数)
end (C++20) | 返回指向末尾的迭代器或哨位 (公开成员函数)
##### 继承自 std::ranges::view_interface
empty (C++20) | 返回视图是否为空。若视图满足 `forward_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
operator bool (C++20) | 返回派生视图是否为非空。若 ranges::empty 可应用于它则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
data (C++20) | 返回派生视图的数据的地址。若视图的迭代器类型满足 `contiguous_iterator` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
size (C++20) | 返回派生视图中的元素数。若视图满足 `forward_range` 且其哨位与迭代器类型满足 `sized_sentinel_for` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
front (C++20) | 返回派生视图中的首元素。若视图满足 `forward_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
back (C++20) | 返回派生视图中的末元素。若视图满足 `bidirectional_range` 与 `common_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
operator[] (C++20) | 返回派生视图中的第 n 个元素。若视图满足 `random_access_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)

### 推导指引

### 辅助模板

template<class T, class Pred> inline constexpr bool enable_borrowed_range<std::ranges::drop_while_view<T, Pred>> = std::ranges::enable_borrowed_range<T>; |  | (C++20 起)

`std::ranges::enable_borrowed_range` 的此特化使得 `drop_while_view` 在底层视图满足 `borrowed_range` 时满足它。

### 注解

为提供 `range` 概念所要求的均摊常数时间复杂度， `begin` 的结果缓存于 `drop_while_view` 对象内。若在首次调用 begin() 修改底层范围，则 `drop_while_view` 对象的后继使用可能导致非本意的行为。

### 示例

    #include <cctype>
    #include <iomanip>
    #include <iostream>
    #include <ranges>
    #include <string>
    #include <string_view>

    std::string trim(std::string_view const in)
    {
        auto view
            = in
            | std::views::drop_while(isspace)
            | std::views::reverse
            | std::views::drop_while(isspace)
            | std::views::reverse
            ;
        return {view.begin(), view.end()};
    }

    int main()
    {
        const auto s = trim(" \f\n\t\r\vHello, C++20!\f\n\t\r\v ");
        std::cout << std::quoted(s) << '\n';

        static constexpr auto v = {0, 1, 2, 3, 4, 5};
        for (int n : v | std::views::drop_while([](int i) { return i < 3; })) {
            std::cout << n << ' ';
        }
    }

输出：

    "Hello, C++20!"
    3 4 5

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3494 | C++20 | `drop_while_view` 始终不是 `borrowed_range` | 若底层视图是 `borrowed_range` 则它是

### 参阅

ranges::drop_view views::drop (C++20) | 由另一 `view` 跳过首 N 个元素组成的 `view` (类模板) (范围适配器对象)