# std::ranges::views::drop, std::ranges::drop_view

< cpp‎ | ranges

定义于头文件 `<ranges>` |  |
template< ranges::view V > class drop_view : public ranges::view_interface<drop_view<V>> | (1) | (C++20 起)
namespace views { inline constexpr /*unspecified*/ drop = /*unspecified*/; } | (2) | (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, static_cast<T>(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) + std::min<D>(ranges::distance(e), f), ranges::end(e)) ，若 `T` 为 std::span、 std::basic_string_view、 ranges::iota_view 或 ranges::subrange 的实现 `random_access_range` 及 `sized_range` 的特化，其中 `U` 为

  - std::span<typename T::element_type> ，若 `T` 为 std::span 的特化；
  - 否则为 T ；

- 否则为 drop_view(e, f) 。

所有情况下 decltype((f)) 必须实现 std::convertible_to<D> 。

`drop_view` 在底层范围 `V` 分别实现概念 `contiguous_range`、 `random_access_range`、 `bidirectional_range`、 `forward_range`、 `input_range`、 `common_range` 及 `sized_range` 时实现该概念。

### 表达式等价

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

### 成员函数

(构造函数) (C++20) | 构造 `drop_view` (公开成员函数)
base (C++20) | 返回底层（适配的）视图的副本 (公开成员函数)
begin (C++20) | 返回指向起始的迭代器 (公开成员函数)
end (C++20) | 返回指向末尾的迭代器或哨位 (公开成员函数)
size (C++20) | 返回元素数，只要底层（适配的）范围满足 `sized_range` (公开成员函数)
##### 继承自 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>` 的公开成员函数)
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> inline constexpr bool enable_borrowed_range<std::ranges::drop_view<T>> = std::ranges::enable_borrowed_range<T>; |  | (C++20 起)

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

### 示例

    #include <ranges>
    #include <iostream>

    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++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3494 | C++20 | `drop_view` 决不是 `borrowed_range` | 若底层范围是 `borrowed_range` 则它是
LWG 3407 | C++20 | `views::drop` 有时无法构造具大小随机访问范围 | 调整构造使之始终合法

### 参阅

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