命名空间
变体
操作

std::ranges::views::take,std::ranges::take_view

来自 cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
 
定义在头文件 <ranges>
template< ranges::view V >

class take_view

    : public ranges::view_interface<take_view<V>>
(1) (自 C++20 起)
namespace views {

    inline constexpr /* unspecified */ take = /* unspecified */;

}
(2) (自 C++20 起)
调用签名
template< ranges::viewable_range R >

    requires /* see below */
constexpr ranges::view auto

    take( R&& r, ranges::range_difference_t<R> count );
(自 C++20 起)
template< class DifferenceType >
constexpr /* range adaptor closure */ take( DifferenceType&& count );
(自 C++20 起)
1) 一个范围适配器,它表示 view 的元素,从基础序列的开头开始,到给定的边界结束。
2) views::take 是一个 RangeAdaptorObject。表达式 views::take(e, f) 会生成一个视图,它表示从 e 开始的第一个 f 个元素。结果不一定是 take_view

views::take(e, f) 与 (其中 Tstd::remove_cvref_t<decltype((e))>Dranges::range_difference_t<decltype((e))>)

(自 C++23 起)
  • 否则,take_view(e, f).
在所有情况下,decltype((f)) 必须满足 std::convertible_to<D> 概念。

take_view 满足 contiguous_rangerandom_access_rangebidirectional_rangeforward_rangeinput_rangesized_range 概念,当底层视图 V 满足相应的概念时。它满足 common_range 概念,当底层视图 V 同时满足 random_access_rangesized_range 概念时。

内容

[edit] 数据成员

成员名称 定义
base_ (private) 底层 view,类型为 V
(仅用于说明的目的,实现不需要以这种方式定义实体,该实体的名称未指定。)
count_ (private) 要取的元素数量,类型为 ranges::range_difference_t<V>
(仅用于说明的目的,实现不需要以这种方式定义实体,该实体的名称未指定。)

[edit] 成员函数

构造 take_view
(公共成员函数) [edit]
返回底层(适应的)视图的副本
(公共成员函数) [edit]
返回指向开头的迭代器
(公共成员函数) [edit]
返回指向结尾的迭代器或哨兵
(公共成员函数) [edit]
返回元素数量。仅当底层(适应的)范围满足 sized_range 概念时提供。
(公共成员函数) [edit]
std::ranges::view_interface 继承
返回派生视图是否为空。仅当它满足 sized_rangeforward_range 概念时提供。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
(C++23)
返回指向范围开头的常量迭代器。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
(C++23)
返回范围的常量迭代器的哨兵。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
返回派生视图是否不为空。仅当 ranges::empty 对它适用时提供。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
获取派生视图数据的地址。仅当它的迭代器类型满足 contiguous_iterator 概念时提供。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
返回派生视图中的第一个元素。仅当它满足 forward_range 概念时提供。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
返回派生视图中的最后一个元素。仅当它满足 bidirectional_rangecommon_range 概念时提供。
(std::ranges::view_interface<D> 的公共成员函数) [edit]
返回派生视图中的第 n 个元素。仅当它满足 random_access_range 概念时提供。
(std::ranges::view_interface<D> 的公共成员函数) [edit]

[edit] 推断指南

[edit] 嵌套类

(C++20)
哨兵类型
(仅用于说明的目的,实现不需要以这种方式定义实体,该实体的名称未指定。)

[edit] 辅助模板

template< class T >

constexpr bool enable_borrowed_range<std::ranges::take_view<T>> =

    ranges::enable_borrowed_range<T>;
(自 C++20 起)

这个 std::ranges::enable_borrowed_range 的特化使得当底层视图满足该概念时,take_view 满足 borrowed_range 概念。

[edit] 示例

#include <algorithm>
#include <iostream>
#include <ranges>
 
int main()
{
    namespace views = std::views;
    auto print = [](char x){ std::cout << x; };
 
    for (const char nums[]{'1', '2', '3'};
         int n : views::iota(0, 5))
    {
        std::cout << "take(" << n << "): ";
        // safely takes only upto min(n, nums.size()) elements:
        std::ranges::for_each(nums | views::take(n), print);
        std::cout << '\n';
    }
}

输出

take(0): 
take(1): 1
take(2): 12
take(3): 123
take(4): 123

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 3407 C++20 views::take 有时无法
构造一个大小固定的随机访问范围
结果类型已调整,因此
构造始终有效
LWG 3494 C++20 take_view 从未是 borrowed_range 如果其底层视图是,它就是一个 borrowed_range

[编辑] 另请参见

从迭代器和计数创建子范围
(定制点对象)[编辑]
一个 view,它由另一个 view 的初始元素组成,直到谓词返回 false 的第一个元素
(类模板) (范围适配器对象)[编辑]
将一定数量的元素复制到新位置
(niebloid)[编辑]