class template
std::ranges::concat_view(C++26)
namespace std::ranges {
template<input_range... Views>
requires (view<Views> && ...) && (sizeof...(Views) > 0) && concatable<Views...>
class concat_view : public view_interface<concat_view<Views...>> {…… }; // (1)
namespace views {
inline constexpr /*unspecified*/ concat = /*unspecified*/; // (2)
}
}
概要
concat_view
は複数のRangeを連結し、1つのRangeとするview
。
Rangeコンセプト
borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
(1) |
〇 |
〇 |
(2) |
(3) |
(4) |
|
(5) |
○ |
○ |
連結するすべてのビューに対して、
- それらの要素に共通の値型
Cv
、参照型Cr
、右辺値参照型Crr
が存在し、
Cr&&
とCv&
、Cr&&
とCrr&&
、Crr&&
とCv const&
にそれぞれ共通の参照型があり、
- 連結するすべてのビューのイテレーター
it
について、
*it
がCr
に変換可能であり、
ranges::iter_move(it)
がCrr
に変換可能であること。
効果
- (2): 式
views::concat(Es...)
の効果は次の通り
備考
本説明に用いる説明専用要素を以下のように定義する。
namespace std::ranges {
template<class... Rs>
using concat-reference-t = common_reference_t<range_reference_t<Rs>...>;
template<class... Rs>
using concat-value-t = common_type_t<range_value_t<Rs>...>;
template<class... Rs>
using concat-rvalue-reference-t = common_reference_t<range_rvalue_reference_t<Rs>...>;
template<class Ref, class RRef, class It>
concept concat-indirectly-readable-impl =
requires (const It it) {
{ *it } -> convertible_to<Ref>;
{ ranges::iter_move(it) } -> convertible_to<RRef>;
};
template<class... Rs>
concept concat-indirectly-readable =
common_reference_with<concat-reference-t<Rs...>&&, concat-value-t<Rs...>&> &&
common_reference_with<concat-reference-t<Rs...>&&, concat-rvalue-reference-t<Rs...>&&> &&
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...>, iterator_t<Rs>> && ...);
template<class... Rs>
concept concatable = requires {
typename concat-reference-t<Rs...>;
typename concat-value-t<Rs...>;
typename concat-rvalue-reference-t<Rs...>;
} && concat-indirectly-readable<Rs...>;
// Fs を Rs の末尾を除いたパックとする
template<bool Const, class... Rs>
concept concat-is-random-access =
all-random-access<Const, Rs...> &&
(common_range<maybe-const<Const, Fs>> && ...);
template<bool Const, class... Rs>
concept concat-is-bidirectional =
all-bidirectional<Const, Rs...> &&
(common_range<maybe-const<Const, Fs>> && ...);
}
メンバ関数
名前 |
説明 |
対応バージョン |
(constructor) |
コンストラクタ |
C++26 |
begin |
先頭を指すイテレータを取得する |
C++26 |
end |
番兵を取得する |
C++26 |
size |
要素数を取得する |
C++26 |
継承しているメンバ関数
推論補助
名前 |
説明 |
対応バージョン |
(deduction_guide) |
クラステンプレートの推論補助 |
C++23 |
例
import std;
int main() {
std::vector<int> v1{1, 2, 3}, v2{4, 5}, v3{};
std::array a{6, 7, 8};
auto s = std::views::single(9);
std::print("{} ", std::views::concat(v1, v2, v3, a, s));
}
出力
[1, 2, 3, 4, 5, 6, 7, 8, 9]
バージョン
言語
処理系
参照