std::ranges::views::join, std::ranges::join_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range V > requires ranges::view<V> and |
(1) | (C++20以降) |
| namespace views { inline constexpr /* unspecified */ join = /* unspecified */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++20以降) | |
1) 範囲のビューを平坦化することによって得られるシーケンスから構成される
view を表す範囲アダプタ。2) RangeAdaptorObject (および RangeAdaptorClosureObject)。任意の適切な部分式 e に対して、式 views::join(e) は 式同等 に join_view<views::all_t<decltype((e))>>{e} となります。
join_view は input_range をモデル化します。
join_view は、次の条件で forward_range をモデル化します。
- ranges::range_reference_t<V> が参照型であり、かつ
- V と ranges::range_reference_t<V> のそれぞれが
forward_rangeをモデル化する場合。
join_view は、次の条件で bidirectional_range をモデル化します。
- ranges::range_reference_t<V> が参照型であり、
- V が
bidirectional_rangeをモデル化し、かつ - ranges::range_reference_t<V> が
bidirectional_rangeとcommon_rangeの両方をモデル化する場合。
join_view は、次の条件で common_range をモデル化します。
- ranges::range_reference_t<V> が参照型であり、かつ
- V と ranges::range_reference_t<V> のそれぞれが
forward_rangeとcommon_rangeの両方をモデル化する場合。
目次 |
[編集] メンバ関数
join_view を構築する(public メンバ関数) | |
| 基になる(適応された)ビューのコピーを返す (public member function) | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 終端へのイテレータまたはセンチネルを返す (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_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[編集] 推論補助
[編集] ネストされたクラス
| イテレータ型 (説明専用メンバクラステンプレート*) | |
| センチネル型 (説明専用メンバクラステンプレート*) |
[編集] 備考
P2328R1 が採択される前は、内部範囲型 (ranges::range_reference_t<V>) はコンテナ型にはなれませんでした (ただし、コンテナへの参照は可能でした)。例えば、std::string prvalue の transform_view を結合することは許可されていませんでした。
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; // error before 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://ja.cppreference.dev 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 prvalue は join_view によって結合できなかった。 |
結合可能になった。 |
[編集] 関連項目
rangeのviewをフラット化し、要素の間に区切り文字を挟んで得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
適合するviewを連結して構成される view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |