Ranges library (since C++20)
rangesライブラリは、アルゴリズムとイテレータライブラリの拡張および一般化であり、それらを合成可能にし、エラーを起こしにくくすることで、より強力にするものです。
このライブラリは範囲 views を作成および操作します。これは、反復可能なシーケンス( ranges )を間接的に表現する軽量オブジェクトです。範囲は
-
[開始,終了)– イテレータペア(例:コンテナからの暗黙変換によって作成される範囲)。イテレータペアを受け取るすべてのアルゴリズムは、範囲を受け入れるオーバーロードを持つようになりました(例: ranges::sort ) -
開始
+[ 0 ,サイズ)– カウント付きシーケンス(例: views::counted によって返される範囲) -
[開始,predicate)– 条件付き終端シーケンス(例: views::take_while によって返される範囲) -
[開始,..)– 無限シーケンス(例: views::iota によって返される範囲)
rangesライブラリは、 rangeアルゴリズム と rangeアダプタ を含みます。rangeアルゴリズムは範囲に対して積極的に適用され、rangeアダプタはビューに対して遅延的に適用されます。アダプタはパイプラインに組み込むことができ、それらのアクションはビューが反復処理される際に実行されます。
|
ヘッダーで定義
<ranges>
|
||
|
namespace
std
{
namespace
views
=
ranges
::
views
;
|
(C++20以降) | |
名前空間エイリアス
std::views
は、
std::ranges::views
の短縮形として提供されます。
|
名前空間
std::ranges
で定義
|
|
Range access |
|
|
定義済みヘッダー
<ranges>
|
|
|
定義済みヘッダー
<iterator>
|
|
|
(C++20)
|
範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲の逆方向イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲への逆イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++26)
|
範囲によって与えられるリザーブヒントと等しい整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲が空かどうかをチェックする
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト) |
レンジプリミティブ |
|
|
定義済みヘッダー
<ranges>
|
|
|
(C++20)
(C++23)
(C++20)
(C++23)
|
範囲のイテレータ型とセンチネル型を取得する
(エイリアステンプレート) |
|
(C++20)
(C++20)
(C++20)
|
範囲のサイズ、差分、および値の型を取得する
(エイリアステンプレート) |
|
(C++20)
(C++23)
(C++20)
(C++20)
|
範囲の参照型を取得する
(エイリアステンプレート) |
ダングリングイテレータの取り扱い |
|
|
定義済みヘッダー
<ranges>
|
|
|
(C++20)
|
イテレータまたは
subrange
がダングリング状態になるため返すべきではないことを示すプレースホルダ型
(クラス) |
borrowed_range
のイテレータ型または
subrange
型を取得する
(エイリアステンプレート) |
|
その他のユーティリティ |
|
|
定義済みヘッダー
<ranges>
|
|
|
(C++23)
|
範囲を単一の値ではなくシーケンスとして扱うことを示すタグ
(クラステンプレート) |
Range コンセプト |
|
|
定義済みヘッダー
<ranges>
|
|
|
(C++20)
|
型が範囲であること、すなわち
begin
イテレータと
end
センチネルを提供することを指定する
(コンセプト) |
|
(C++20)
|
型が
range
であり、その式から取得したイテレータがダングリングの危険なく安全に返却できることを指定する
(コンセプト) |
|
範囲が定数時間でそのサイズを推定できることを指定する
(concept) |
|
|
(C++20)
|
範囲がそのサイズを定数時間で知ることができることを指定する
(コンセプト) |
|
(C++20)
|
範囲がビューであること、すなわち定数時間でのコピー/ムーブ/代入が可能であることを指定する
(コンセプト) |
|
(C++20)
|
イテレータ型が
input_iterator
を満たす範囲を指定する
(コンセプト) |
|
(C++20)
|
イテレータ型が
output_iterator
を満たす範囲を指定する
(コンセプト) |
|
(C++20)
|
前方イテレータを満たすイテレータ型を持つ範囲を指定する
forward_iterator
(コンセプト) |
|
(C++20)
|
双方向イテレータの要件を満たすイテレータ型を持つ範囲を指定する
bidirectional_iterator
(コンセプト) |
|
(C++20)
|
イテレータ型が
random_access_iterator
を満たす範囲を指定する
(コンセプト) |
|
(C++20)
|
連続したイテレータ型を満たす範囲を指定する
contiguous_iterator
(コンセプト) |
|
(C++20)
|
範囲が同一のイテレータ型とセンチネル型を持つことを指定する
(コンセプト) |
|
(C++20)
|
range
が安全に
view
に変換可能であるための要件を指定する
(コンセプト) |
|
(C++23)
|
範囲が読み取り専用要素を持つことを指定する
(コンセプト) |
範囲変換 |
|
|
ヘッダーで定義
<ranges>
|
|
|
(C++23)
|
入力範囲から新しい非ビューオブジェクトを構築する
(関数テンプレート) |
ビュー |
|
|
定義済みヘッダー
<ranges>
|
|
|
(C++20)
|
view
を定義するためのヘルパークラステンプレート、
curiously recurring template pattern
を使用
(クラステンプレート) |
|
(C++20)
|
イテレータとセンチネルのペアを
view
に結合する
(クラステンプレート) |
レンジファクトリ
|
ヘッダーで定義
<ranges>
|
|
|
名前空間で定義
std::ranges
|
|
|
(C++20)
|
要素を持たない空の
view
(クラステンプレート) (変数テンプレート) |
指定された値の単一要素を含む
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
初期値を繰り返しインクリメントして生成されるシーケンスからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
同じ値を繰り返し生成して作成されるシーケンスからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
関連付けられた入力ストリームに対する
operator>>
の連続的な適用によって得られる要素からなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
レンジアダプタ
|
定義済みヘッダー
<ranges>
|
|
|
名前空間
std::ranges
で定義
|
|
|
(C++23)
|
レンジアダプタクロージャオブジェクトを定義するためのヘルパーベースクラステンプレート
(クラステンプレート) |
|
(C++20)
|
view
を返す
range
の全要素を含む
(エイリアステンプレート) (レンジアダプタオブジェクト) |
|
(C++20)
|
他の
range
の要素を参照する
view
(クラステンプレート) |
|
(C++20)
|
ある
view
を一意所有する
range
(クラステンプレート) |
各要素を右辺値にキャストするシーケンスの
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
view
で、述語を満たす
range
の要素から構成される
(クラステンプレート) (range adaptor object) |
|
各要素に変換関数を適用するシーケンスの
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
別の
view
の最初のN個の要素から構成される
view
(クラステンプレート) (レンジアダプタオブジェクト) |
別の
view
の先頭要素から、述語が
false
を返す最初の要素までを含む
view
(クラステンプレート) (範囲アダプタオブジェクト) |
|
|
(C++20)
|
別の
view
の要素からなる
view
。最初のN個の要素をスキップする
(クラステンプレート) (レンジアダプタオブジェクト) |
別の
view
の要素から構成される
view
。述語が
false
を返す最初の要素までの初期部分列をスキップする
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
view
の
range
s
からなる
view
を平坦化して得られるシーケンスから構成される
(クラステンプレート) (range adaptor object) |
a
view
範囲のビューから平坦化して得られたシーケンスから構成されるビューで、要素間に区切り文字を挿入する
(クラステンプレート) (範囲アダプタオブジェクト) |
|
デリミタを使用して別の
view
を分割して得られる部分範囲に対する
view
(クラステンプレート) (範囲アダプタオブジェクト) |
|
|
(C++20)
|
デリミタを使用して別の
view
を分割して得られる部分範囲を表す
view
(クラステンプレート) (範囲アダプタオブジェクト) |
アダプトされたビューの連結からなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト) |
view
を
common_range
に変換する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
双方向
view
の要素を逆順に反復する
(クラステンプレート) (範囲アダプタオブジェクト) |
|
view
を
constant_range
に変換する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
view
から成る
tuple-like
値と数値Nを取り、各タプルのN
th
要素から成る
view
を生成する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
ペアのような値からなる
view
を受け取り、各ペアの最初の要素からなる
view
を生成する
(クラステンプレート) (レンジアダプタオブジェクト) |
ペアのような値からなる
view
を受け取り、各ペアの2番目の要素からなる
view
を生成する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
適応されたシーケンスの各要素を、要素の位置とその値の両方を含むタプルにマッピングする
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++23)
|
適応されたビューの対応する要素への参照のタプルから構成される
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
変換関数を適用したビューの対応する要素の結果から構成される
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
適応されたビューの隣接する要素への参照のタプルから構成される
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
適応されたビューの隣接する要素に変換関数を適用した結果からなる
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++23)
|
別の
view
の要素からなる、サイズ
N
の非重複連続チャンクの
view
の範囲
(クラステンプレート) (範囲アダプタオブジェクト) |
|
(C++23)
|
M
th
要素が別の
view
のM
th
から(M + N - 1)
th
要素までの
view
である
view
(クラステンプレート) (レンジアダプタオブジェクト) |
指定された述語が
false
を返す隣接要素の各ペア間で
view
を部分範囲に分割する
(クラステンプレート) (範囲アダプタオブジェクト) |
|
別の
view
の要素から構成され、一度にN要素進む
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
アダプトされたビューのn項デカルト積によって計算された結果のタプルからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
基となるシーケンスの最後にアクセスされた要素をキャッシュする
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
view
を
input_range
のみで、非
common_range
の範囲に変換する
(クラステンプレート) (範囲アダプタオブジェクト) |
|
レンジジェネレータ (C++23以降)
|
ヘッダーで定義
<generator>
|
|
|
名前空間で定義
std
|
|
|
(C++23)
|
同期
コルーチン
ジェネレータを表す
view
(クラステンプレート) |
ヘルパーアイテム
レンジアダプタオブジェクト
RangeAdaptorObject (RAO) を参照してください。
レンジアダプタクロージャオブジェクト
RangeAdaptorClosureObject (RACO) を参照してください。
カスタマイゼーションポイントオブジェクト
Customization point object (CPO) を参照してください。
代入可能ラッパー
一部の範囲アダプタは、その要素や関数オブジェクトを
copyable-box
(until C++23)
movable-box
(since C++23)
でラップします。このラッパーは、必要に応じてラップされたオブジェクトに代入可能性を追加します。
非伝播キャッシュ
一部のレンジアダプタは、説明専用のクラステンプレート
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
)
|
(3) | ( 説明専用* ) |
T
について:
-
Tが整数型の場合、 /*make-signed-like-t*/ < T > は std:: make_signed_t < T > である。 -
それ以外の場合、
/*make-signed-like-t*/
<
T
>
は
Tと同じ幅を持つ対応する未規定の符号付き整数ライク型である。
T
に対して:
-
Tが整数型の場合、 /*make-unsigned-like-t*/ < T > は std:: make_unsigned_t < T > である。 -
それ以外の場合、
/*make-signed-like-t*/
<
T
>
は
Tと同じ幅を持つ対応する未規定の符号なし整数ライク型である。
カスタマイゼーションポイントオブジェクトヘルパー
|
template
<
ranges::
input_range
R
>
constexpr
auto
&
/*possibly-const-range*/
(
R
&
r
)
noexcept
|
(1) | ( 説明専用* ) |
|
template
<
class
T
>
constexpr
auto
/*as-const-pointer*/
(
const
T
*
p
)
noexcept
|
(2) | ( 説明専用* ) |
一部の範囲アクセスカスタマイゼーションポイントオブジェクトは、これらの説明専用の関数テンプレートに基づいて規定されています。
レンジアダプタヘルパー
|
template
<
class
F,
class
Tuple
>
constexpr
auto
/*tuple-transform*/
(
F
&&
f, Tuple
&&
tuple
)
|
(1) | ( 説明専用* ) |
|
template
<
class
F,
class
Tuple
>
constexpr
void
/*tuple-for-each*/
(
F
&&
f, Tuple
&&
tuple
)
|
(2) | ( 説明専用* ) |
|
template
<
class
T
>
constexpr
T
&
/*左辺値として*/
(
T
&&
t
)
|
(3) | ( 説明専用* ) |
一部の範囲アダプタは、これらの説明専用の関数テンプレートに基づいて規定されています。
ヘルパー概念
以下の説明専用の概念はいくつかの型で使用されていますが、これらは標準ライブラリのインターフェースの一部ではありません。
|
template
<
class
R
>
concept
/*単純ビュー*/
=
|
(1) | ( 説明専用* ) |
|
template
<
class
I
>
concept
/*has-arrow*/
=
|
(2) | ( 説明専用* ) |
|
template
<
class
T,
class
U
>
concept
/*different-from*/
=
|
(3) | ( 説明専用* ) |
|
template
<
class
R
>
concept
/*移動可能な参照を持つ範囲*/
=
|
(4) | ( 説明専用* ) |
|
template
<
bool
C,
class
...
Views
>
concept
/*all-random-access*/
=
|
(5) | ( 説明専用* ) |
|
template
<
bool
C,
class
...
Views
>
concept
/*all-bidirectional*/
=
|
(6) | ( 説明専用* ) |
|
template
<
bool
C,
class
...
Views
>
concept
/*all-forward*/
=
|
(7) | ( 説明専用* ) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_generator
|
202207L
|
(C++23) | std:: generator 同期コルーチンジェネレータ for 範囲 |
__cpp_lib_ranges
|
201911L
|
(C++20) | 範囲ライブラリと 制約付きアルゴリズム |
202106L
|
(C++23)
(DR20) |
非 default-initializable views | |
202110L
|
(C++23)
(DR20) |
Views と 所有権 | |
202202L
|
(C++23) | ranges:: range_adaptor_closure | |
202207L
|
(C++23) | ムーブオンリー型を許可するための レンジアダプタ の緩和 | |
202211L
|
(C++23) | 「ポイズンピル」オーバーロードの削除 (P2602) in ranges:: begin など | |
202302L
|
(C++23) | 特定の射影を許可するための範囲の緩和 | |
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_repeat
|
202207L
|
(C++23) | ranges:: repeat_view |
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges :: reserve_hint および ranges :: 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; }; // ビューを合成する「パイプ」構文: for (int i : ints | std::views::filter(even) | std::views::transform(square)) std::cout << i << ' '; std::cout << '\n'; // 従来の「関数型」合成構文: 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 | レンジアダプターオブジェクトが末尾引数をどのようにバインドするか不明確だった | 値によってバインドされる |
| LWG 3948 | C++23 |
possibly-const-range
と
as-const-pointer
が noexcept で宣言されていなかった |
noexcept で宣言される |
| LWG 4027 | C++23 |
possibly-const-range
が既に
constant_range
をモデル化しているレンジに対して
const修飾を追加しなかった |
そのようなレンジに対しても
const修飾を追加する |
| LWG 4112 | C++20 |
has-arrow
が
i
のconst修飾を要求していなかった
|
要求する |