namespace std::ranges {
template<input_range V, forward_range Pattern>
requires view<V> && input_range<range_reference_t<V>>
&& view<Pattern>
&& compatible-joinable-ranges<range_reference_t<V>, Pattern>
class join_with_view : public view_interface<join_with_view<V, Pattern>> { …… }; // (1)
namespace views {
inline constexpr /*unspecified*/ join_with = /*unspecified*/; // (2)
}
}
概要
join_with_view
は要素がRangeであるRangeの各要素を繋げて1つのRangeとして扱うview
。
その際、join_view
と異なり、外側のRangeの各要素の間にデリミタを挿入する。
デリミタは単一の要素またはRangeである。デリミタがRangeの場合、外側のRangeの各要素の間にデリミタの各要素が毎回挿入される。
- (1):
join_with_view
のクラス定義 - (2):
join_with_view
を生成するRangeアダプタオブジェクト
Rangeコンセプト
borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
---|---|---|---|---|---|---|---|---|---|---|
〇 | (1) | (2) | (3) | ○ | ○ |
- (1): 外側・内側のRangeが
forward_range
であり、内側Rangeが参照型のとき - (2): 外側・内側のRangeが
bidirectional_range
であり、内側Rangeが参照型かつcommon_range
であるとき - (3): 外側・内側のRangeが
forward_range
かつcommon_range
でありconst
ではない場合、内側のRangeは参照型(prvalueではない)
外側RangeとはV
のことであり、内側Rangeとはrange_reference_t<V>
のことである。const
の場合V
をconst V
として同様。
効果
- (2): 式
views::join_with(E, F)
の効果はjoin_with_view{E, F}
と等しい。
備考
本説明に用いる説明専用要素を以下のように定義する。
namespace std::ranges {
template<class R, class P>
concept compatible-joinable-ranges = // 説明専用
common_with<range_value_t<R>, range_value_t<P>> &&
common_reference_with<range_reference_t<R>, range_reference_t<P>> &&
common_reference_with<range_reference_t<R>, range_rvalue_reference_t<P>>;
template<class R>
concept bidirectional-common = bidirectional_range<R> && common_range<R>; // 説明専用
}
メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++23 |
base |
V の参照を取得する |
C++23 |
begin |
先頭を指すイテレータを取得する | C++23 |
end |
番兵を取得する | C++23 |
継承しているメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
empty |
Rangeが空かどうかを判定する | C++20 |
operator bool |
Rangeが空でないかどうかを判定する | C++20 |
front |
先頭要素への参照を取得する | C++20 |
back |
末尾要素への参照を取得する | C++20 |
cbegin |
定数イテレータを取得する | C++23 |
cend |
定数イテレータ(番兵)を取得する | C++23 |
推論補助
名前 | 説明 | 対応バージョン |
---|---|---|
(deduction_guide) |
クラステンプレートの推論補助 | C++23 |
例
出力
h
e
l
l
o
-
w
o
r
l
d
ネストされた char
のRangeが平坦な char
のRangeになっている。
例 (結果を文字列にする)
#include <ranges>
#include <vector>
#include <string>
#include <print>
int main() {
using namespace std;
vector<string> sv = {"hello", "world"};
println("{}", sv | views::join_with("-C++23-"sv) | ranges::to<string>());
}
出力
hello-C++23-world
join_with
で得られる char
のRangeはstring
ではないが、ranges::to
を使って変換できる。
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: 13.2 ✅
- ICC: ??
- Visual C++: ??