最終更新日時: 2026年05月22日 11時42分20秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<ranges>

# std::ranges::drop_view(C++20)

    namespace std::ranges {
      template<view V>
      class drop_view : public view_interface<drop_view<V>> { …… };  // (1)

      namespace views {
        inline constexpr /*unspecified*/ drop = /*unspecified*/;     // (2)
      }
    }

## 概要

- (1): 元のRangeの先頭から指定した個数の値を除去したRangeとして振る舞う`view`
- (2): `drop_view`、または(1)の動作を実現する`view`を生成するRangeアダプタオブジェクト

元のRangeの大きさを超える個数が指定された場合、`drop`が返す`view`は空になる。

### Rangeコンセプト

borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
(1) | (1) | (1) | (1) | (1) | (1) | (1) | (1) | (1) | ○ | ○

- (1): `V`に従う

## テンプレートパラメータ制約

- `view<V>`

## 効果

- (2): `E`および`F`を式、型`T`を`remove_cvref_t<decltype((E))>`、型`D`を`range_difference_t<decltype((E))>`とする。式`views::drop(E, F)`の効果は以下の通り
  - `decltype((F))`が`convertible_to<D>`のモデルでなければ、呼び出しは不適格
  - `T`が`ranges::empty_view`の特殊化であれば、`((void) F, decay-copy(E))`と等しい。ただし、`E`と`F`の評価順序は不定順で序列化(indeterminately sequenced)される
  - C++26 : `T`が`std::optional`の特殊化で`view`のモデルであれば、`F`が0と等しいとき`decay-copy(E)`、そうでないとき空の`T()`と等しい
  - `T`が`random_access_range`および`sized_range`のモデルであり、かつ次のいずれかの特殊化であるとき、`T(ranges::begin(E) + min<D>(ranges::size(E), F), ranges::end(E))`と等しい。ただし、`E`は1度だけ評価される
    - `span` (ただし、`T::extent == dynamic_extent`であること)
    - `basic_string_view`
    - `ranges::iota_view`
    - `ranges::subrange`
  - それ以外のとき、`ranges::drop_view(E, F)`

`drop_view`でラップする必要が無い型では`drop_view`を使わないようになっている。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++20
`base` | `V`の参照を取得する | C++20
`begin` | 先頭を指すイテレータを取得する | C++20
`end` | 番兵を取得する | C++20
`size` | 要素数を取得する | C++20
`reserve_hint` | 要素数の近似値を取得する | C++26

`r`を元のRangeとする。`size`は`ranges::size(r)`が有効な式であるときに定義される。

## 継承しているメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | Rangeが空かどうかを判定する | C++20
`operator bool` | Rangeが空でないかどうかを判定する | C++20
`data` | Rangeの先頭へのポインタを取得する | C++20
`front` | 先頭要素への参照を取得する | C++20
`back` | 末尾要素への参照を取得する | C++20
`operator[]` | 要素へアクセスする | C++20
`cbegin` | 定数イテレータを取得する | C++23
`cend` | 定数イテレータ（番兵）を取得する | C++23

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++20

## 例

    #include <ranges>
    #include <iostream>

    int main() {
      using namespace std;

      for (int i : views::iota(1, 10) | views::drop(5)) {
        cout << i;
      }
    }

### 出力

    6789

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 参照

- N4861 24 Ranges library
- C++20 ranges
- P2367R0 Remove misuses of list-initialization from Clause 24 (本提案文書はC++20に遡って適用されている)
- P2393R1 Cleaning up integer-class types
- P2017R1 Conditionally borrowed ranges
- P3913R1 Optimize for `std::optional` in range adaptors
  - C++26で、入力が`std::optional`の場合の特殊化を追加