# std::ranges::views::take_while, std::ranges::take_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 take_while_view : public ranges::view_interface<take_while_view<V, Pred>> | (1) | (C++20 起)
namespace views { inline constexpr /*unspecified*/ take_while = /*unspecified*/; } | (2) | (C++20 起)

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

take_while_view 分别在底层视图 V 实现 `contiguous_range`、 `random_access_range`、 `bidirectional_range`、 `forward_range` 及 `input_range` 时实现该概念。

### 表达式等价

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

### 成员函数

(构造函数) (C++20) | 构造 `take_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>` 的公开成员函数)
front (C++20) | 返回派生视图中的首元素。若视图满足 `forward_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
operator[] (C++20) | 返回派生视图中的第 n 个元素。若视图满足 `random_access_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)

### 推导指引

### 嵌套类

sentinel | 哨位类型 (仅用于阐释的成员类模板)

### 示例

    #include <ranges>
    #include <iostream>

    int main()
    {
        for (int year : std::views::iota(2017)
                      | std::views::take_while([](int y) { return y <= 2020; })) {
            std::cout << year << ' ';
        }
        std::cout << '\n';

        const char idea[] {"Today is yesterday's tomorrow!.."};
        for (char x : std::ranges::take_while_view(idea, [](char c) { return c != '.'; })) {
            std::cout << x;
        }
        std::cout << '\n';
    }

输出：

    2017 2018 2019 2020
    Today is yesterday's tomorrow!

### 参阅

ranges::take_view views::take (C++20) | 由另一 `view` 的前 N 个元素组成的 `view` (类模板) (范围适配器对象)
ranges::drop_while_view views::drop_while (C++20) | 由另一 `view` 跳过元素的起始序列，直至首个谓词返回 `false` 的元素组成的 `view` (类模板) (范围适配器对象)