std::ranges:: views:: concat, std::ranges:: concat_view
|
定義於標頭檔
<ranges>
|
||
|
template
<
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(1) | (C++26以降) |
|
namespace
views
{
inline
constexpr
/* unspecified */
concat
=
/* unspecified */
;
|
(2) | (C++26以降) |
|
呼び出しシグネチャ
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
requires
/* 詳細は下記参照 */
|
(C++26以降) | |
|
ヘルパー型エイリアス
|
||
|
template
<
class
...
Rs
>
using
/*concat-reference-t*/
=
|
(3) | ( 説明専用* ) |
|
template
<
class
...
Rs
>
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ; |
(4) | ( 説明専用* ) |
|
template
<
class
...
Rs
>
using
/*concat-rvalue-reference-t*/
=
|
(5) | ( 説明専用* ) |
|
ヘルパーコンセプト
|
||
|
template
<
class
Ref,
class
RRef,
class
It
>
concept /*concat-indirectly-readable-impl*/ = /* 説明を参照 */ ; |
(6) | ( 説明専用* ) |
|
template
<
class
...
Rs
>
concept /*concatable*/ = /* 説明を参照 */ ; |
(7) | ( 説明専用* ) |
concat_view
は、任意の数の範囲を引数リストとして受け取り、最初の範囲の最初の要素から始まり、最後の範囲の最後の要素で終わるビューを提供する
view
ファクトリです。引数で指定された順序で、すべての範囲要素がそれぞれの間に順序付けされており、実質的に引数範囲を連結または連鎖させます。
view
s
のパックであり、各
view
は少なくとも
input_range
をモデル化し、かつ
concatable
(7)
であるもの。
views::concat
はカスタマイゼーションポイントオブジェクトです。
サブ式のパック exprs が与えられたとき、式 views :: concat ( exprs... ) は以下と 式等価 です:
-
views::
all
(
exprs...
)
ただし
exprs
が単一要素のパックで、その型が
input_rangeをモデル化する場合 - concat_view ( exprs... ) 上記以外の場合
iter_move
をカスタマイズするケースも正しくサポートする右辺値参照。
template< class... Rs > concept /*concat-indirectly-readable*/ = // 説明専用 std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::common_reference_with</*concat-rvalue-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...> const&> && (/*concat-indirectly-readable-impl*/</*concat-reference-t*/<Rs...>, /*concat-rvalue-reference-t*/<Rs...>, ranges::iterator_t<Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // exposition only requires(const It it) { { *it } -> std::convertible_to<Ref>; { ranges::iter_move(it)} -> std::convertible_to<RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // exposition only typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view
は常に
input_range
をモデルし、また各適応された
view
型が対応するコンセプトをモデルする場合、
forward_range
、
bidirectional_range
、
random_access_range
または
sized_range
をモデルします。
concat_view
は、最後の基となる範囲が
common_range
をモデル化する場合、
common_range
になり得ます。
目次 |
カスタマイゼーションポイントオブジェクト
views::concat
という名前は
カスタマイゼーションポイントオブジェクト
を表します。これは
関数オブジェクト
の const な
リテラル
semiregular
クラス型です。詳細については
CustomizationPointObject
を参照してください。
データメンバ
| メンバー | 説明 |
std::
tuple
<
Views...
>
views_
|
すべての適応されたビューオブジェクト
( 説明専用メンバーオブジェクト* ) |
メンバー関数
concat_view
を構築する
(public member function) |
|
|
先頭を指すイテレータを返す
(public member function) |
|
|
終端を指すイテレータまたはセンチネルを返す
(public member function) |
|
要素数を返す(基となる(アダプトされた)範囲が
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)
|
|
派生ビューの最初の要素を返す(
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)
|
|
推論ガイド
ネストされたクラス
| クラス名 | 定義 |
|
イテレータ型
( 説明専用メンバークラステンプレート* ) |
ヘルパーテンプレート
concat_view
に対する
ranges::
enable_borrowed_range
の特殊化は存在しません。これは、イテレータの実装がすべての基盤となる範囲のすべてのイテレータとセンチネルを常時保持することを必要とするためです。
注記
引数なしの
views
::
concat
(
)
は ill-formed です。なぜなら要素型
T
を決定する合理的な方法が存在しないためです。単一引数の
views
::
concat
(
r
)
は、
views::
all
(
r
)
と等価な式です。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_concat
|
202403L
|
(C++26) |
std::ranges::concat_view
|
例
プレビュー版は Compiler Explorer で確認できます。
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector<int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single(i)}; auto con = std::views::concat(v0, v1, a, ie); assert(con.size() == v0.size() + v1.size() + std::size(a) + ie.size()); std::println("con.size(): {}", con.size()); std::println("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert(a[1] == 42); // a[1] was modified via con[6] std::println("con: {}", con); std::list<int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
出力:
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
参考文献
- C++26標準 (ISO/IEC 14882:2026):
-
- 26.7.18 連結ビュー [range.concat]
関連項目
|
(C++20)
|
view
のシーケンスを平坦化して得られるシーケンスからなる
view
(クラステンプレート) (range adaptor object) |
rangeのviewを平坦化して得られるシーケンスからなる
view
。要素間に区切り文字が挿入される
(クラステンプレート) (range adaptor object) |
|
|
(C++23)
|
適応されたviewの対応する要素への参照のタプルからなる
view
(クラステンプレート) (customization point object) |
適応されたviewのn項デカルト積によって計算された結果のタプルからなる
view
(クラステンプレート) (customization point object) |