std::ranges::views::take, std::ranges::take_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::view V > class take_view |
(1) | (C++20以降) |
| namespace views { inline constexpr /* 未指定 */ take = /* 未指定 */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++20以降) | |
| template< class DifferenceType > constexpr /* レンジアダプタクロージャ */ take( DifferenceType&& count ); |
(C++20以降) | |
1) 元となるシーケンスの先頭から指定された境界までの要素の
viewを表すレンジアダプタ。2)
views::take はRangeAdaptorObjectです。式 views::take(e, f) は、e の最初の f 個の要素を表すビューを生成します。結果は必ずしも take_view とは限りません。views::take(e, f) は、(ここで T は std::remove_cvref_t<decltype((e))> で、D は ranges::range_difference_t<decltype((e))>) である 式同値です。
- ((void)f,
decay-copy(e))、もしTが ranges::empty_view の場合。ただし、e と f の評価は不定順序です。 - U(ranges::begin(e), ranges::begin(e) + std::min<D>(ranges::distance(e), f))、もし
Tが std::span、std::basic_string_view、または ranges::subrange の特殊化であり、かつrandom_access_rangeとsized_rangeの両方をモデルとする場合。ここでUは
- std::span<typename T::element_type>、もし
Tが std::span の特殊化である場合。 -
T、もしTが std::basic_string_view の特殊化である場合。 - ranges::subrange<ranges::iterator_t<T>>、もし
Tが ranges::subrange の特殊化である場合。
- std::span<typename T::element_type>、もし
- ranges::iota_view(*ranges::begin(e),
*(ranges::begin(e) + std::min<D>(ranges::distance(e), f)))、もしTが ranges::iota_view の特殊化であり、かつrandom_access_rangeとsized_rangeの両方をモデルとする場合。
|
(C++23から) |
- それ以外の場合、take_view(e, f)。
take_view は、元となるビュー V が対応するコンセプトをモデルとする場合、contiguous_range、random_access_range、bidirectional_range、forward_range、input_range、および sized_range をモデルとします。元となるビュー V が random_access_range と sized_range の両方をモデルとする場合、common_range をモデルとします。
目次 |
[編集] データメンバ
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
ranges::range_difference_t<V> count_ (private) |
取得する要素数 (説明用のメンバオブジェクト*) |
[編集] メンバ関数
take_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 メンバ関数) | |
[編集] 推論ガイド
[編集] ネストされたクラス
| (C++20) |
センチネル型 (説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class T > constexpr bool enable_borrowed_range<std::ranges::take_view<T>> = |
(C++20以降) | |
std::ranges::enable_borrowed_range のこの特殊化により、元となるビューがそれを満たす場合に take_view は borrowed_range を満たすようになります。
[編集] 例
このコードを実行
#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 がサイズ付きランダムアクセスレンジの構築に失敗することがあった結果の型が調整され、 |
構築が常に有効になるようにしたtake_view は borrowed_range ではなかった |
| LWG 3494 | C++20 | take_view が borrowed_range になることはなかった |
基になるビューがそうであれば、borrowed_range になる |
[編集] 関連項目
| (C++20) |
イテレータとカウントから部分rangeを作成する (カスタマイゼーションポイントオブジェクト) |
別のviewの先頭から、述語がfalseを返す最初の要素までの要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
| (C++20) |
指定された数の要素を新しい場所にコピーする (アルゴリズム関数オブジェクト) |