std::ranges::views::take, std::ranges::take_view
| ヘッダ <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 以降) | |
views::take は RangeAdaptorObject です。式 views::take(e, f) は、f からの最初の e 個の要素を表すビューを生成します。結果は必ずしも 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 の特殊化である場合;
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)です。
decltype((f)) は std::convertible_to<D> のモデルでなければなりません。take_view は、元のビュー がそれぞれのコンセプトのモデルである場合、コンセプト contiguous_range、random_access_range、bidirectional_range、forward_range、input_range、および sized_rangeV のモデルとなります。これは、元のビュー が random_access_rangeV と sized_range の両方のモデルである場合、common_range のモデルとなります。
データメンバ
| メンバー | 説明 |
V
base_
|
基となるビュー
( 説明専用メンバーオブジェクト* ) |
ranges::
range_difference_t
<
V
>
count_
|
取得する要素の数
( 説明専用メンバーオブジェクト* ) |
メンバー関数
take_viewを構築する
(public member function) |
|
|
基盤となる(アダプトされた)ビューのコピーを返す
(public member function) |
|
|
先頭へのイテレータを返す
(public member function) |
|
|
終端へのイテレータまたはセンチネルを返す
(public member function) |
|
要素数を返す(基盤となる(アダプトされた)範囲が
sized_range
を満たす場合にのみ提供)
(public member function) |
|
|
(C++26)
|
結果の
approximately_sized_range
の近似サイズを返す
(public member function) |
ranges::view_interface から継承 | |
| 派生ビューが空であるかどうかを返します。ただし、それが sized_range または forward_range を満たす場合に限ります std::ranges::view_interface<D> のパブリックメンバ関数
| |
(C++23) |
範囲の先頭への定数イテレータを返します のパブリックメンバ関数 std::ranges::view_interface<D>
|
(C++23) |
範囲の定数イテレータに対する番兵を返します のパブリックメンバ関数 std::ranges::view_interface<D>
|
| 派生ビューが空でないかどうかを返します。ただし、ranges::empty がそれに適用可能な場合に限ります のパブリックメンバ関数 std::ranges::view_interface<D>
| |
| 派生ビューのデータのアドレスを取得します。ただし、そのイテレータ型が contiguous_iterator を満たす場合に限ります std::ranges::view_interface<D> のパブリックメンバ関数
| |
| 派生ビューの最初の要素を返します。ただし、それが forward_range を満たす場合に限ります std::ranges::view_interface<D> のパブリックメンバ関数
| |
| 派生ビューの最後の要素を返します。ただし、それが bidirectional_range と common_range を満たす場合に限ります std::ranges::view_interface<D> のパブリックメンバ関数
| |
派生ビューの n番目 の要素を返します。ただし、それが random_access_range を満たす場合に限ります std::ranges::view_interface<D> のパブリックメンバ関数
| |
推論ガイド
ネストされたクラス
|
(C++20)
|
センチネル型
( 説明専用メンバークラステンプレート* ) |
ヘルパーテンプレート
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
take_view
<
T
>>
=
|
(C++20以降) | |
この
ranges::enable_borrowed_range
の特殊化は、基盤となるビューが
borrowed_range
を満たす場合に、
take_view
がそれを満たすようにする。
例
#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
の場合、
それも
borrowed_range
となる
|
関連項目
|
(C++20)
|
イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト) |
別の
view
の先頭要素から構成される
view
。述語が
false
を返す最初の要素まで
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
指定された数の要素を新しい場所にコピーする
(アルゴリズム関数オブジェクト) |