名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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::takeRangeAdaptorObjectです。式 views::take(e, f) は、e の最初の f 個の要素を表すビューを生成します。結果は必ずしも take_view とは限りません。

views::take(e, f) は、(ここで Tstd::remove_cvref_t<decltype((e))> で、Dranges::range_difference_t<decltype((e))>) である 式同値です。

(C++23から)
  • それ以外の場合、take_view(e, f)
すべての場合において、decltype((f))std::convertible_to<D> をモデルとしなければなりません。

take_view は、元となるビュー V が対応するコンセプトをモデルとする場合、contiguous_rangerandom_access_rangebidirectional_rangeforward_rangeinput_range、および sized_range をモデルとします。元となるビュー Vrandom_access_rangesized_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_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

[編集] 推論ガイド

[編集] ネストされたクラス

センチネル型
(説明専用メンバクラステンプレート*)

[編集] ヘルパーテンプレート

template< class T >

constexpr bool enable_borrowed_range<std::ranges::take_view<T>> =

    ranges::enable_borrowed_range<T>;
(C++20以降)

std::ranges::enable_borrowed_range のこの特殊化により、元となるビューがそれを満たす場合に take_viewborrowed_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_viewborrowed_range ではなかった
LWG 3494 C++20 take_viewborrowed_range になることはなかった 基になるビューがそうであれば、borrowed_range になる

[編集] 関連項目

イテレータとカウントから部分rangeを作成する
(カスタマイゼーションポイントオブジェクト)[編集]
別のviewの先頭から、述語がfalseを返す最初の要素までの要素からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
指定された数の要素を新しい場所にコピーする
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)