Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
template < ranges:: view V >

class take_view

: public ranges:: view_interface < take_view < V >>
(1) (C++20以降)
namespace views {

inline constexpr /* 未規定 */ take = /* 未規定 */ ;

}
(2) (C++20以降)
呼び出しシグネチャ
template < ranges:: viewable_range R >

requires /* 下記参照 */
constexpr ranges:: view auto

take ( R && r, ranges:: range_difference_t < R > count ) ;
(C++20以降)
template < class DifferenceType >
constexpr /* レンジアダプタクロージャ */ take ( DifferenceType && count ) ;
(C++20以降)
1) 基となるシーケンスの要素から、先頭から開始して指定された境界で終了する view を表す範囲アダプタ。
2) views::take is a RangeAdaptorObject . The expression views :: take ( e, f ) results in a view that represents the first f elements from e . The result is not necessarily a take_view .

views :: take ( e, f ) は( T std:: remove_cvref_t < decltype ( ( e ) ) > D ranges:: range_difference_t < decltype ( ( e ) ) > の場合) 式等価 です:

(C++23以降)
  • それ以外の場合、 take_view ( e, f )
In all cases, decltype ( ( f ) ) must model std:: convertible_to < D > **翻訳結果:** std:: convertible_to < D > **説明:** - HTMLタグ、属性、C++固有の用語(`std::convertible_to`)は翻訳していません - ` `、`
`、``タグ内のテキストは翻訳対象外ですが、この例では該当しません
- 元のフォーマットと構造を完全に保持しています
.

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_ 基となるビュー
( 説明専用メンバーオブジェクト* )
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)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の先頭への定数イテレータを返す
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の定数イテレータのセンチネルを返す
( std::ranges::view_interface<D> のpublic member function)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューのデータのアドレスを取得する(そのイテレータ型が contiguous_iterator を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最初の要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最後の要素を返す( bidirectional_range かつ common_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの n th 番目の要素を返す( random_access_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)

推論ガイド

ネストされたクラス

(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 を返す最初の要素まで
(クラステンプレート) (レンジアダプタオブジェクト)
指定された数の要素を新しい場所にコピーする
(アルゴリズム関数オブジェクト)