std::ranges:: views:: join, std::ranges:: join_view
|
ヘッダーで定義
<ranges>
|
||
|
template
<
ranges::
input_range
V
>
requires
ranges::
view
<
V
>
and
|
(1) | (C++20以降) |
|
namespace
views
{
inline
constexpr
/* 未規定 */
join
=
/* 未規定 */
;
|
(2) | (C++20以降) |
|
呼び出しシグネチャ
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* 下記参照 */
|
(C++20以降) | |
view
を表す範囲アダプタ。
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
を構築する
(公開メンバ関数) |
|
|
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数) |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数) |
|
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
で、適応されたビューの連結からなる
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |