Namespaces
Variants

std::ranges:: views:: join, std::ranges:: join_view

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
template < ranges:: input_range V >

requires ranges:: view < V > and
ranges:: input_range < ranges:: range_reference_t < V >>
class join_view

: public ranges:: view_interface < join_view < V >>
(1) (C++20以降)
namespace views {

inline constexpr /* 未規定 */ join = /* 未規定 */ ;

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

requires /* 下記参照 */

constexpr ranges:: view auto join ( R && r ) ;
(C++20以降)
1) 範囲のビューから平坦化されたシーケンスで構成される view を表す範囲アダプタ。
2) RangeAdaptorObject (および RangeAdaptorClosureObject )。式 views :: join ( e ) 式等価 である join_view < views:: all_t < decltype ( ( e ) ) >> { e } に、任意の適切な部分式 e に対して。

join_view input_range をモデル化します。

join_view は以下の場合に forward_range をモデル化します:

join_view は以下の場合に bidirectional_range をモデル化します:

join_view は以下の場合に common_range をモデル化します:

目次

メンバー関数

join_view を構築する
(公開メンバ関数)
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)
(C++23)
範囲の先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> の公開メンバ関数)
(C++23)
範囲の定数イテレータに対するセンチネルを返す
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューの最初の要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューの最後の要素を返す( bidirectional_range および common_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)

推論ガイド

ネストされたクラス

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

注記

P2328R1が採用される以前は、内部範囲の型( ranges:: range_reference_t < V > )をコンテナ型とすることはできませんでした(ただしコンテナへの参照は可能でした)。例えば、 std::string のprvalueを transform_view で変換した範囲をjoinすることは許可されていませんでした。

struct Person { int age; std::string name; };
auto f(std::vector<Person>& v) {
//  return v | std::views::transform([](auto& p){ return p.name; })
//           | std::views::join; // P2328R1以前はエラー
    return v | std::views::transform([](auto& p) -> std::string& { return p.name; })
             | std::views::join; // OK
}

#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>
int main()
{
    using namespace std::literals;
    const auto bits = {"https:"sv, "//"sv, "cppreference"sv, "."sv, "com"sv};
    for (char const c : bits | std::views::join)
        std::cout << c;
    std::cout << '\n';
    const std::vector<std::vector<int>> v{{1, 2}, {3, 4, 5}, {6}, {7, 8, 9}};
    auto jv = std::ranges::join_view(v);
    for (int const e : jv)
        std::cout << e << ' ';
    std::cout << '\n';
}

出力:

https://cppreference.net
1 2 3 4 5 6 7 8 9

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3474 C++20 views :: join ( e ) e join_view の場合に e のコピーを返していた ネストした join_view を返す
P2328R1 C++20 非ビューの range prvaluesは join_view で結合できなかった 結合可能にした

関連項目

view で、範囲のビューを平坦化して得られるシーケンスからなり、要素間にデリミタを挿入する
(クラステンプレート) (レンジアダプタオブジェクト)
view で、適応されたビューの連結からなる
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)