Namespaces
Variants

std::ranges::views::take, std::ranges::take_view

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
 
ヘッダ <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 以降)
1) 元のシーケンスの先頭から始まり、指定された境界で終わる、要素のビューを表す範囲アダプタです。
2) 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 の両方のモデルである場合;
  • views::repeat(*e.value_, std::min<D>(ranges::distance(e), f))、もし T が sized_range のモデルである場合。その場合、e は一度だけ評価されます;
  • views::repeat(*e.value_, static_cast<D>(e)) それ以外の場合;
(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)
結果の 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 >> =

ranges:: enable_borrowed_range < 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 となる

関連項目

イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト)
別の view の先頭要素から構成される view 。述語が false を返す最初の要素まで
(クラステンプレート) (レンジアダプタオブジェクト)
指定された数の要素を新しい場所にコピーする
(アルゴリズム関数オブジェクト)