名前空間
変種
操作

Rangesライブラリ (C++20以降)

From cppreference.com
< cpp
 
 
Rangesライブラリ
Rangeアダプタ
 

Rangeライブラリは、アルゴリズムライブラリとイテレータライブラリを拡張および一般化したものであり、組み合わせ可能でエラーを起こしにくくすることで、より強力なものにします。

このライブラリは、反復可能なシーケンス(range)を間接的に表現する軽量なオブジェクトであるrange viewを生成・操作します。Rangeは、以下のものの上位にある抽象化です。

  • [beginend) – イテレータのペア、例: コンテナからの暗黙の変換によって作られるrange。イテレータのペアを受け取るすべてのアルゴリズムには、rangeを受け取るオーバーロードが追加されました (例: ranges::sort)。
  • begin + [0size) – カウントされるシーケンス、例: views::counted が返すrange。
  • [beginpredicate) – 条件付きで終端するシーケンス、例: views::take_while が返すrange。
  • [begin..) – 無限シーケンス、例: views::iota が返すrange。

Rangeライブラリには、rangeに先行評価で適用されるrangeアルゴリズムと、viewに遅延評価で適用されるrangeアダプタが含まれます。アダプタはパイプラインに構成することができ、そのアクションはviewが反復されるときに実行されます。

ヘッダ <ranges> で定義
namespace std {

    namespace views = ranges::views;

}
(C++20以降)

名前空間エイリアス std::viewsstd::ranges::views の短縮形として提供されます。

名前空間 std::ranges で定義

目次

Rangeアクセス
ヘッダ <ranges> で定義
ヘッダ <iterator> で定義
rangeの先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeの終端を示す番兵を返す
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用rangeの先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用rangeの終端を示す番兵を返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeへの逆イテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeへの逆終端イテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用rangeへの逆イテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用rangeへの逆終端イテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeによって与えられる予約ヒントと等しい整数を返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeのサイズと等しい整数を返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeのサイズと等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト)[編集]
rangeが空かどうかをチェックする
(カスタマイゼーションポイントオブジェクト)[編集]
連続rangeの先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用の連続rangeの先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)[編集]
Rangeプリミティブ
ヘッダ <ranges> で定義
rangeのイテレータ型と番兵型を取得する
(エイリアステンプレート)[編集]
rangeのサイズ型、差分型、値型を取得する
(エイリアステンプレート)[編集]
rangeの参照型を取得する
(エイリアステンプレート)[編集]
ダングリングイテレータの扱い
ヘッダ <ranges> で定義
イテレータや subrange がダングリングになるため返されるべきでないことを示すプレースホルダー型
(クラス) [編集]
borrowed_range のイテレータ型または subrange 型を取得する
(エイリアステンプレート)[編集]
その他のユーティリティ
ヘッダ <ranges> で定義
rangeを単一の値ではなくシーケンスとして扱うようにタグ付けする
(クラステンプレート) [編集]
Rangeコンセプト
ヘッダ <ranges> で定義
型がrangeであること、すなわち begin イテレータと end 番兵を提供することを規定する
(コンセプト) [編集]
型がrangeであり、その式のインスタンスから取得したイテレータがダングリングの危険なく安全に返されることを規定する
(コンセプト) [編集]
rangeが定数時間でそのサイズを推定できることを規定する
(コンセプト) [編集]
rangeが定数時間でそのサイズを知っていることを規定する
(コンセプト) [編集]
rangeがviewであること、すなわち定数時間でのコピー/ムーブ/代入を持つことを規定する
(コンセプト) [編集]
イテレータ型が input_iterator を満たすrangeを規定する
(コンセプト) [編集]
イテレータ型が output_iterator を満たすrangeを規定する
(コンセプト) [編集]
イテレータ型が forward_iterator を満たすrangeを規定する
(コンセプト) [編集]
イテレータ型が bidirectional_iterator を満たすrangeを規定する
(コンセプト) [編集]
イテレータ型が random_access_iterator を満たすrangeを規定する
(コンセプト) [編集]
イテレータ型が contiguous_iterator を満たすrangeを規定する
(コンセプト) [編集]
rangeが同一のイテレータ型と番兵型を持つことを規定する
(コンセプト) [編集]
rangeview に安全に変換できるための要件を規定する
(コンセプト) [編集]
rangeが読み取り専用の要素を持つことを規定する
(コンセプト) [編集]
Range変換
ヘッダ <ranges> で定義
入力rangeから新しい非viewオブジェクトを構築する
(関数テンプレート) [編集]
表示
ヘッダ <ranges> で定義
CRTP (Curiously Recurring Template Pattern) を使用してviewを定義するためのヘルパークラステンプレート
(クラステンプレート) [編集]
イテレータと番兵のペアをviewに結合する
(クラステンプレート) [編集]

[編集] Rangeファクトリ

ヘッダ <ranges> で定義
名前空間 std::ranges で定義
要素を持たない空の view
(クラステンプレート) (変数テンプレート)[編集]
指定された値の単一要素を含む view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
初期値を繰り返しインクリメントして生成されるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
同じ値を繰り返し生成することで得られるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
関連付けられた入力ストリームに対して operator>> を連続して適用することで得られる要素からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]

[編集] Rangeアダプタ

ヘッダ <ranges> で定義
名前空間 std::ranges で定義
rangeアダプタクロージャオブジェクトを定義するためのヘルパー基底クラステンプレート
(クラステンプレート) [編集]
rangeのすべての要素を含む view
(エイリアステンプレート) (rangeアダプタオブジェクト)[編集]
他の何らかのrangeの要素の view
(クラステンプレート) [編集]
何らかのrangeの唯一の所有権を持つ view
(クラステンプレート) [編集]
各要素を右辺値にキャストするシーケンスの view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
述語を満たすrangeの要素からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの最初のN個の要素からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの先頭から、述語がfalseを返す最初の要素までの要素からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素から、最初のN個の要素をスキップして構成される view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素から、述語がfalseを返す最初の要素までの先頭部分シーケンスをスキップして構成される view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
rangeviewをフラット化して得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
rangeのviewをフラット化し、要素の間に区切り文字を挟んで得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewを区切り文字で分割して得られる部分rangeに対する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewを区切り文字で分割して得られる部分rangeに対する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewを連結して構成される view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
イテレータとカウントから部分rangeを作成する
(カスタマイゼーションポイントオブジェクト)[編集]
viewcommon_range に変換する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別の双方向viewの要素を逆順に反復処理する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
viewconstant_range に変換する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
tuple-like な値からなるviewと数値Nを取り、各タプルのN番目の要素のviewを生成する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
ペアのような値からなるviewを取り、各ペアの最初の要素のviewを生成する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
ペアのような値からなるviewを取り、各ペアの2番目の要素のviewを生成する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するシーケンスの各要素を、その要素の位置と値の両方を含むタプルにマッピングする view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewの対応する要素への参照のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
適合するviewの対応する要素に変換関数を適用した結果からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
適合するviewの隣接する要素への参照のタプルからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewの隣接する要素に変換関数を適用した結果からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
M番目の要素が別のviewのM番目から(M + N - 1)番目の要素に対するviewであるview
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
与えられた述語がfalseを返す隣接要素のペアごとにviewを部分rangeに分割する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素からなり、一度にN個の要素を飛ばして進む view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewのn項デカルト積によって計算された結果のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
基になるシーケンスの最後にアクセスされた要素をキャッシュする view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
viewinput_rangeのみで、非common_rangeであるrangeに変換する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]

[編集] Rangeジェネレータ (C++23以降)

ヘッダ <generator> で定義
名前空間 std で定義
(C++23)
同期的なコルーチンジェネレータを表す view
(クラステンプレート) [編集]

[編集] ヘルパーアイテム

[編集] Rangeアダプタオブジェクト

RangeAdaptorObject (RAO) を参照。

[編集] Rangeアダプタクロージャオブジェクト

RangeAdaptorClosureObject (RACO) を参照。

[編集] カスタマイゼーションポイントオブジェクト

カスタマイゼーションポイントオブジェクト (CPO) を参照。

[編集] 代入可能なラッパー

いくつかのrangeアダプタは、その要素や関数オブジェクトを copyable-box(C++23まで)movable-box(C++23以降) でラップします。このラッパーは、ラップされたオブジェクトに必要に応じて代入可能性を追加します。

[編集] 伝播しないキャッシュ

いくつかのrangeアダプタは、説明専用のクラステンプレート non-propagating-cache で規定されています。これは std::optional<T> とほぼ同様に振る舞います(違いについては説明を参照)。

[編集] 条件付きconst

template< bool Const, class T >
using /*maybe-const*/ = std::conditional_t<Const, const T, T>;
(説明用*)

エイリアステンプレート /*maybe-const*/ は、型 T に条件付きで const 修飾子を適用するための短縮形です。

[編集] 整数のような型のヘルパーテンプレート

template< /*is-integer-like*/ T >
using /*make-signed-like-t*/<T> = /* 説明を参照 */;
(1) (説明用*)
template< /*is-integer-like*/ T >
using /*make-unsigned-like-t*/<T> = /* 説明を参照 */;
(2) (説明用*)
template< /*is-integer-like*/ T >

/*make-unsigned-like-t*/<T> /*to-unsigned-like*/( T t )
{
    return static_cast</*make-unsigned-like-t*/<T>>(t);

}
(3) (説明用*)
1) 整数のような型 T に対して
  • T が整数型の場合、/*make-signed-like-t*/<T>std::make_signed_t<T> です。
  • そうでない場合、/*make-signed-like-t*/<T>T と同じ幅を持つ、対応する未規定の符号付き整数のような型です。
2) 整数のような型 T に対して
  • T が整数型の場合、/*make-unsigned-like-t*/<T>std::make_unsigned_t<T> です。
  • そうでない場合、/*make-signed-like-t*/<T>T と同じ幅を持つ、対応する未規定の符号無し整数のような型です。
3) t/*make-unsigned-like-t*/<T> に明示的に変換します。

[編集] カスタマイゼーションポイントオブジェクトヘルパー

template< ranges::input_range R >

constexpr auto& /*possibly-const-range*/(R& r) noexcept
{
    if constexpr (ranges::input_range<const R>)
        return const_cast<const R&>(r);
    else
        return r;

}
(1) (説明用*)
template< class T >

constexpr auto /*as-const-pointer*/( const T* p ) noexcept
{
    return p;

}
(2) (説明用*)

いくつかのrangeアクセスカスタマイゼーションポイントオブジェクトは、これらの説明専用の関数テンプレートで規定されています。

1) /*possibly-const-range*/ は、const Rinput_range をモデル化する場合、r のconst修飾版を返します。そうでない場合は、キャストせずに r を返します。
2) /*as-const-pointer*/ は、定数型のオブジェクトへのポインタを返します。

[編集] Rangeアダプタヘルパー

template< class F, class Tuple >

constexpr auto /*tuple-transform*/( F&& f, Tuple&& tuple )
{
    return std::apply([&]<class... Ts>(Ts&&... args)
    {
        return std::tuple<std::invoke_result_t<F&, Ts>...>
            (std::invoke(f, std::forward<Ts>(args))...);
    }, std::forward<Tuple>(tuple));

}
(1) (説明用*)
template< class F, class Tuple >

constexpr void /*tuple-for-each*/( F&& f, Tuple&& tuple )
{
    std::apply([&]<class... Ts>(Ts&&... args)
    {
        (static_cast<void>(std::invoke(f, std::forward<Ts>(args))), ...);
    }, std::forward<Tuple>(tuple));

}
(2) (説明用*)
template< class T >

constexpr T& /*as-lvalue*/
( T&& t )
{
    return static_cast<T&>(t);

}
(3) (説明用*)

いくつかのrangeアダプタは、これらの説明専用の関数テンプレートで規定されています。

1) /*tuple-transform*/ は、tuple の各要素に f を適用して構築された新しいタプルを返します。
2) /*tuple-for-each*/ は、tuple の各要素に f を適用し、何も返しません。
3) /*as-lvalue*/ は、右辺値 t を左辺値として転送します。

[編集] ヘルパーコンセプト

以下の説明専用のコンセプトはいくつかの型で使用されますが、標準ライブラリのインターフェースの一部ではありません。

template< class R >

concept /*simple-view*/ =
    ranges::view<R> && ranges::range<const R> &&
    std::same_as<ranges::iterator_t<R>, ranges::iterator_t<const R>> &&

    std::same_as<ranges::sentinel_t<R>, ranges::sentinel_t<const R>>;
(1) (説明用*)
template< class I >

concept /*has-arrow*/ =
    ranges::input_iterator<I> &&

    (std::is_pointer_v<I> || requires(const I i) { i.operator->(); });
(2) (説明用*)
template< class T, class U >

concept /*different-from*/ =

    !std::same_as<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
(3) (説明用*)
template< class R >

concept /*range-with-movable-references*/ =
    ranges::input_range<R> &&
    std::move_constructible<ranges::range_reference_t<R>> &&

    std::move_constructible<ranges::range_rvalue_reference_t<R>>;
(4) (説明用*)
template< bool C, class... Views >

concept /*all-random-access*/ =
    (ranges::random_access_range

         <std::conditional_t<C, const Views, Views>> && ...);
(5) (説明用*)
template< bool C, class... Views >

concept /*all-bidirectional*/ =
    (ranges::bidirectional_range

         <std::conditional_t<C, const Views, Views>> && ...);
(6) (説明用*)
template< bool C, class... Views >

concept /*all-forward*/ =
    (ranges::forward_range

         <std::conditional_t<C, const Views, Views>> && ...);
(7) (説明用*)

[編集] ノート

機能テストマクロ 規格 機能
__cpp_lib_generator 202207L (C++23) std::generator – rangeのための同期コルーチンジェネレータ
__cpp_lib_ranges 201911L (C++20) Rangesライブラリと制約付きアルゴリズム
202106L (C++23)
(DR20)
デフォルト初期化可能view
202110L (C++23)
(DR20)
所有権を持つView
202202L (C++23) ranges::range_adaptor_closure
202207L (C++23) ムーブオンリー型を許容するようにrangeアダプタを緩和
202211L (C++23) ranges::beginなどにおける「ポイズンピル」(P2602)オーバーロードの削除
202302L (C++23) 特定のプロジェクションを許可するようにrangeを緩和
202406L (C++26)
(DR20)
間接的に呼び出し可能なコンセプトから共通参照要件を削除
__cpp_lib_ranges_as_const 202207L (C++23) std::const_iterator, ranges::as_const_view
__cpp_lib_ranges_as_rvalue 202207L (C++23) ranges::as_rvalue_view
__cpp_lib_ranges_cache_latest 202411L (C++26) ranges::cache_latest_view
__cpp_lib_ranges_cartesian_product 202207L (C++23) ranges::cartesian_product_view
__cpp_lib_ranges_chunk 202202L (C++23) ranges::chunk_view
__cpp_lib_ranges_chunk_by 202202L (C++23) ranges::chunk_by_view
__cpp_lib_ranges_concat 202403L (C++26) ranges::concat_view
__cpp_lib_ranges_enumerate 202302L (C++23) ranges::enumerate_view
__cpp_lib_ranges_join_with 202202L (C++23) ranges::join_with_view
__cpp_lib_ranges_repeat 202207L (C++23) ranges::repeat_view
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::reserve_hintranges::approximately_sized_range
__cpp_lib_ranges_slide 202202L (C++23) ranges::slide_view
__cpp_lib_ranges_stride 202207L (C++23) ranges::stride_view
__cpp_lib_ranges_to_container 202202L (C++23) ranges::to
__cpp_lib_ranges_to_input 202502L (C++26) ranges::to_input_view
__cpp_lib_ranges_zip 202110L (C++23) ranges::zip_view,
ranges::zip_transform_view,
ranges::adjacent_view,
ranges::adjacent_transform_view

[編集]

#include <iostream>
#include <ranges>
 
int main()
{
    auto const ints = {0, 1, 2, 3, 4, 5};
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
 
    // the "pipe" syntax of composing the views:
    for (int i : ints | std::views::filter(even) | std::views::transform(square))
        std::cout << i << ' ';
 
    std::cout << '\n';
 
    // a traditional "functional" composing syntax:
    for (int i : std::views::transform(std::views::filter(ints, even), square))
        std::cout << i << ' ';
}

出力

0 4 16
0 4 16

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3509
(P2281R1)
C++20 Rangeアダプタオブジェクトが後続の引数をどのように束縛するかが不明確だった 値によって
束縛されるようになった
LWG 3948 C++23 possibly-const-rangeas-const-pointer
noexcept として宣言されていなかった
noexcept として宣言された
LWG 4027 C++23 possibly-const-range は、すでに constant_range をモデル化しているRangeに対して
const修飾を付加しなかった
そのようなRangeに対して
const修飾を付加するようになった
LWG 4112 C++20 has-arrowi がconst修飾されていることを要求しなかった 要求するようになった

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)