名前空間
変種
操作

std::ranges::views::concat, std::ranges::concat_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <ranges> で定義
template< ranges::input_range... Views >

    requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) &&
              /*concatable*/<Views...>
class concat_view

    : public ranges::view_interface<concat_view<Views...>>
(1) (C++26以降)
namespace views {

    inline constexpr /* unspecified */ concat = /* unspecified */;

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

    requires /* 以下を参照 */

constexpr ranges::view auto concat( Rs&&... rs );
(C++26以降)
ヘルパー型エイリアス
template< class... Rs >

using /*concat-reference-t*/ =

    ranges::common_reference_t<ranges::range_reference_t<Rs>...>;
(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*/ =

    ranges::common_reference_t<ranges::range_rvalue_reference_t<Rs>...>;
(5) (説明用*)
ヘルパーコンセプト
template< class Ref, class RRef, class It >
concept /*concat-indirectly-readable-impl*/ = /* see description */;
(6) (説明用*)
template< class... Rs >
concept /*concatable*/ = /* see description */;
(7) (説明用*)

concat_view は、任意の数のレンジを引数リストとして受け取る view ファクトリを提供します。これは、最初のレンジの最初の要素から始まり、最後のレンジの最後の要素で終わるビューを提供し、すべてのレンジの要素は、引数で与えられた順序で効果的に連結され、つまり引数レンジが連鎖します。

1) テンプレートパラメータが空でない view のパックであり、各パックが少なくとも input_range をモデル化し、かつ concatable (7) であるクラステンプレート。
2) views::concat はカスタマイズポイントオブジェクトです。

サブ式のパック exprs が与えられた場合、式 views::concat(exprs...) は、exprsinput_range をモデル化する単一の要素のパックである場合は

  • views::all(exprs...) に、それ以外の場合は
  • concat_view(exprs...)式同値です。
3) 参照型を表します。各基底レンジの ranges::range_reference_tranges::common_reference_t に変換可能であることを保証するために追加の制約が必要です。
4) 基底レンジにプロキシイテレータがある場合をサポートするために、基底レンジの value_type をさらに尊重する iterator::value_type
5) 基底イテレータが iter_move をカスタマイズするケースも正しくサポートする rvalue 参照。
6) concat_viewinput_range をモデル化できるように、iteratorindirectly-readable コンセプトを定義します。
同値
template< class... Rs >
concept /*concat-indirectly-readable*/ = // exposition only
    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>> && ...);
ただし、exposition-only コンセプト /*concat-indirectly-readable-impl*/
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>;
    };
7) 2つ以上の異なるレンジが、それ自体がレンジをモデル化するシーケンスにアダプトできるかどうかを決定します。同値
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_rangebidirectional_rangerandom_access_range、または sized_range をモデル化します。

最後の基底レンジが common_range をモデル化する場合、concat_viewcommon_range になり得ます。

目次

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

views::concat という名前は、const FunctionObject であり、LiteralTypesemiregular クラス型の *カスタマイズポイントオブジェクト* を指します。exposition の目的で、その型の cv-unqualified バージョンは __concat_fn と表記されます。

すべての __concat_fn のインスタンスは等価です。異なる __concat_fn 型のインスタンスを同じ引数で呼び出す効果は、インスタンスを表す式が lvalue か rvalue か、また cv 修飾されているかどうかにかかわらず同等です(ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、views::concat は自由にコピーでき、そのコピーは互換性があります。

型のセット Args... が与えられた場合、std::declval<Args>()... が上記の views::concat への引数の要件を満たす場合、__concat_fn は以下をモデル化します。

それ以外の場合、__concat_fn の関数呼び出し演算子のいずれもオーバーロード解決に参加しません。

[edit] データメンバー

メンバ 説明
std::tuple<Views...> views_ すべての適応されたビューオブジェクト
(説明用のメンバオブジェクト*)

[edit] メンバ関数

concat_view を構築します
(public メンバ関数) [編集]
先頭へのイテレータを返す
(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 メンバ関数) [編集]
派生ビューが 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 メンバ関数) [編集]

[edit] 推論ガイド

[edit] ネストされたクラス

クラス名 定義
イテレータ型
(説明専用メンバクラステンプレート*)

[edit] ヘルパーテンプレート

concat_view のための ranges::enable_borrowed_range の特殊化は存在しません。これは、イテレータの実装が、常にすべての基底レンジのすべてのイテレータとセンチネルのコピーを含む必要があるためです。

[edit] 注記

引数なしの views::concat() は ill-formed です。なぜなら、要素型 T を決定する合理的な方法がないためです。単一引数の views::concat(r)views::all(r) と式同値です。

機能テストマクロ 規格 機能
__cpp_lib_ranges_concat 202403L (C++26) std::ranges::concat_view

[edit]

予備版は 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]

[edit] 参照

  • C++26 標準 (ISO/IEC 14882:2026)
  • 26.7.18 Concat view [range.concat]

[edit] 関連項目

rangeviewをフラット化して得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
rangeのviewをフラット化し、要素の間に区切り文字を挟んで得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewの対応する要素への参照のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
適合するviewのn項デカルト積によって計算された結果のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)