Namespaces
Variants

std::ranges::views::take_while, std::ranges::take_while_view

来自 zh.cppreference.net
 
 
范围库
范围适配器
 
 
定义于头文件 <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 起)
调用签名
template< ranges::viewable_range R, class Pred >
    requires /* see below */
constexpr ranges::view auto take_while( R&& r, Pred&& pred );
(C++20 起)
template< class Pred >
constexpr /*range adaptor closure*/ take_while( Pred&& pred );
(C++20 起)
1) 一个范围适配器,表示基础序列中从开头开始,到谓词首次返回 view 的元素所构成的 falsefalse
2) RangeAdaptorObject。表达式 views::take_while(e, f) 对于任何合适的子表达式 表达式等价 于 take_while_view(e, f)ese 和 fpred

take_while_view 当底层视图 contiguous_range、random_access_range、bidirectional_range、forward_range 和 input_range 概念时,V 分别对这些概念进行建模。

数据成员

成员 描述
V base_ (私有) 底层视图
(仅用于阐述的成员对象*)

copyable-box<Pred>

(至 C++23)

movable-box<Pred>

(自 C++23 起)
pred_ (私有)
底层函数对象
(仅用于阐述的成员对象*)

成员函数

构造一个 take_while_view
(公开成员函数)
返回底层(适配后)视图的副本
(公开成员函数)
返回存储的谓词的引用
(公开成员函数)
返回指向起始位置的迭代器
(公开成员函数)
返回表示结束位置的哨兵
(公开成员函数)
继承自 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> 的公开成员函数)
返回派生视图中第 nn 个元素,仅当它满足 random_access_range
时提供 (std::ranges::view_interface<D> 的公开成员函数)

推导指引

嵌套类

哨兵类型
( 仅用于说明的成员类模板* )

注释

对于 forward_iterator s , views :: take_while ( v, pred ) 类似于 ranges:: subrange { ranges:: begin ( v ) , ranges:: find_if_not ( v, pred ) } ,但后者仅在构造期间调用 pred (而前者在每次有效的 take_while 迭代器与哨位比较时都会调用 pred )。

示例

#include <iostream>
#include <ranges>
int main()
{
    for (int year : std::views::iota(2020)
                  | std::views::take_while([](int y){ return y < 2026; }))
        std::cout << year << ' ';
    std::cout << '\n';
    const char note[]{"Today is yesterday's tomorrow!..."};
    auto not_dot = [](char c){ return c != '.'; };
    for (char x : std::ranges::take_while_view(note, not_dot))
        std::cout << x;
    std::cout << '\n';
}

输出:

2020 2021 2022 2023 2024 2025
Today is yesterday's tomorrow!

参见

由另一个 view 的前N个元素组成的 view
(类模板) (范围适配器对象)
由另一个 view 的元素组成的 view ,跳过初始元素子序列直至首个谓词返回 false 的元素
(类模板) (范围适配器对象)