std::ranges::views::drop, std::ranges::drop_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::view V > class drop_view |
(1) | (C++20以降) |
| namespace views { inline constexpr /* unspecified */ drop = /* unspecified */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++20以降) | |
| template< class DifferenceType > constexpr /* range adaptor closure */ drop( DifferenceType&& count ); |
(C++20以降) | |
1) 元のシーケンスの要素から、最初のN個の要素をスキップした範囲アダプター。
2) RangeAdaptorObject。
T を std::remove_cvref_t<decltype((e))>、D を ranges::range_difference_t<decltype((e))> とすると、式 views::drop(e, f) は- ((void)f,
decay-copy(e))、Tが ranges::empty_view である場合、e と f の評価は未定義の順序となります。 - それ以外の場合、T(ranges::begin(e) + inc, ranges::end(e),
/*to-unsigned-like*/(ranges::distance(e) - inc))、Tがrandom_access_rangeとsized_rangeの両方をモデルとする ranges::subrange の特殊化であり、Tがサイズを格納する必要がある場合(詳細は ranges::subrange::subrange() を参照)、ここで inc は std::min<D>(ranges::distance(e), f) です。 - それ以外の場合、U(ranges::begin(e) + inc, ranges::end(e))、
Tが std::span、std::basic_string_view、ranges::iota_view、または ranges::subrange の特殊化であり、random_access_rangeとsized_rangeの両方をモデルとする場合、ここでUは
|
(C++23から) |
- それ以外の場合、drop_view(e, f)。
drop_view は、基になるビュー V が対応するコンセプトをモデルとする場合、contiguous_range、random_access_range、bidirectional_range、forward_range、input_range、common_range、および sized_range をモデルとします。
目次 |
[edit] データメンバー
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
ranges::range_difference_t<V> count_ (private) |
スキップする要素数 (説明用のメンバオブジェクト*) |
non-propagating-cache<ranges::iterator_t<V>> cache_ (private)( V が forward_range を満たすが、random_access_range および sized_range を満たさない場合にのみ存在)
|
begin() の呼び出し結果をキャッシュするオブジェクト(説明用のメンバオブジェクト*) |
[edit] メンバー関数
drop_view を構築します(public メンバ関数) | |
| 基になる(適応された)ビューのコピーを返す (public member function) | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 終端へのイテレータまたはセンチネルを返す (public メンバ関数) | |
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す(public メンバ関数) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
イテレータ型が contiguous_iterator を満たす場合にのみ、派生ビューのデータのアドレスを取得する( std::ranges::view_interface<D> の公開メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[edit] 推論ガイド
[edit] ヘルパーテンプレート
| template< class T > constexpr bool enable_borrowed_range<std::ranges::drop_view<T>> = |
(C++20以降) | |
ranges::enable_borrowed_range のこの特殊化により、基になるビューがそれを満たす場合、drop_view は borrowed_range を満たします。
[edit] 例
このコードを実行
#include <iostream> #include <ranges> int main() { const auto nums = {1, 2, 3, 4, 5, 6, 7}; std::cout << "drop " << 2 << ": "; for (int i : std::ranges::drop_view{nums, 2}) std::cout << i << ' '; std::cout << '\n'; std::cout << "drop " << 3 << ": "; for (int i : nums | std::views::drop(3)) std::cout << i << ' '; std::cout << '\n'; std::cout << "drop " << 4 << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(4)) std::cout << i << ' '; std::cout << '\n'; // Note that dropping more than the number of elements is OK: for (int dp : {5, 6, 7, 890, 100500}) { std::cout << "drop " << dp << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(dp)) std::cout << i << ' '; std::cout << '\n'; } }
出力
drop 2: 3 4 5 6 7 drop 3: 4 5 6 7 drop 4: 5 6 7 drop 5: 6 7 drop 6: 7 drop 7: drop 890: drop 100500:
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3407 | C++20 | views::drop は、サイズ付きランダムアクセス範囲を構築できない場合がある。 |
構築は調整される 常に有効になるように |
| LWG 3494 | C++20 | drop_view はこれまで borrowed_range ではありませんでした。 |
基になるビューがそうであれば、borrowed_range になる |
[edit] 関連項目
別のviewの要素から、述語がfalseを返す最初の要素までの先頭部分シーケンスをスキップして構成される view(クラステンプレート) (rangeアダプタオブジェクト) |