std::ranges::views::concat, std::ranges::concat_view
<ranges>
requires (ranges::view <Views> && ...) && (sizeof...(Views) > 0) &&
/*concatable*/<Views...>
class concat_view
inline constexpr /* unspecified */ concat = /* unspecified */;
requires /* see below */
using /*concat-reference-t*/ =
using /*concat-value-t*/ = std::common_type_t <ranges::range_value_t <Rs>...>;
using /*concat-rvalue-reference-t*/ =
concept /*concat-indirectly-readable-impl*/ = /* see description */;
concept /*concatable*/ = /* see description */;
concat_view presents a view factory that takes an arbitrary number of ranges as an argument list, and provides a view that starts at the first element of the first range, ends at the last element of the last range, with all range elements sequenced in between respectively in the order given in the arguments, effectively concatenating, or chaining together the argument ranges.
views each of which models at least input_range and is concatable (7).views::concat is a customization point object.
Given a pack of subexpressions exprs, the expression views::concat(exprs...) is expression-equivalent to
- views::all (exprs...) if exprs is a pack with only one element whose type models
input_range, - concat_view(exprs...) otherwise.
iterator::value_type that additionally respects the underlying ranges’ value_type to support the cases when the underlying ranges have proxy iterators.iter_move.indirectly-readable concept for the iterator so that concat_view can model input_range.template< class... Rs > concept /*concat-indirectly-readable*/ = // exposition only std::common_reference_with </*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with </*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::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...>, ranges::iterator_t <Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // exposition only requires(const It it) { { *it } -> std::convertible_to <Ref>; { ranges::iter_move (it)} -> std::convertible_to <RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // exposition only typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view always models input_range, and models forward_range, bidirectional_range, random_access_range, or sized_range if each adapted view type models the corresponding concept.
concat_view can be common_range if the last underlying range models common_range.
Contents
Customization point objects
The name views::concat denotes a customization point object, which is a const function object of a literal semiregular class type. See CustomizationPointObject for details.
[edit] Data members
[edit] Member functions
sized_range (public member function) [edit]
Inherited from std::ranges::view_interface
sized_range or forward_range (public member function of
std::ranges::view_interface<D>) [edit]
(public member function of
std::ranges::view_interface<D>) [edit]
(public member function of
std::ranges::view_interface<D>) [edit]
(public member function of
std::ranges::view_interface<D>) [edit]
forward_range (public member function of
std::ranges::view_interface<D>) [edit]
bidirectional_range and common_range (public member function of
std::ranges::view_interface<D>) [edit]
nth element in the derived view, provided only if it satisfies random_access_range (public member function of
std::ranges::view_interface<D>) [edit]
[edit] Deduction guides
[edit] Nested classes
[edit] Helper templates
There is no specialization of ranges::enable_borrowed_range for concat_view, because this would require the iterator implementation to contain a copy of all iterators and sentinels of all underlying ranges at all times.
[edit] Notes
No argument views::concat() is ill-formed, because there is no reasonable way to determine an element type T. Single argument views::concat(r) is expression equivalent to views::all (r).
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_concat |
202403L |
(C++26) | std::ranges::concat_view
|
[edit] Example
The preliminary version can be checked out on Compiler Explorer.
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector <int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single (i)}; auto con = std::views::concat(v0, v1, a, ie); assert (con.size() == v0.size() + v1.size() + std::size (a) + ie.size()); std::println ("con.size(): {}", con.size()); std::println ("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert (a[1] == 42); // a[1] was modified via con[6] std::println ("con: {}", con); std::list <int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println ("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
Output:
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
[edit] References
- C++26 standard (ISO/IEC 14882:2026):
- 26.7.18 Concat view [range.concat]
[edit] See also
view consisting of the sequence obtained from flattening a view of ranges (class template) (range adaptor object)[edit]
view consisting of the sequence obtained from flattening a view of ranges, with the delimiter in between elements(class template) (range adaptor object)[edit]
view consisting of tuples of references to corresponding elements of the adapted views(class template) (customization point object)[edit]