std::ranges::views::lazy_split, std::ranges::lazy_split_view
Defined in header <ranges> | ||
template<ranges::input_range V, ranges::forward_range Pattern > requires ranges::view<V>&& | (1) | (since C++20) |
namespace views { inlineconstexpr/* unspecified */ lazy_split =/* unspecified */; | (2) | (since C++20) |
Call signature | ||
template<ranges::viewable_range R, class Pattern > requires /* see below */ | (since C++20) | |
template<class Pattern > constexpr/* range adaptor closure */ lazy_split( Pattern&& pattern ); | (since C++20) | |
Helper concepts | ||
template<class R > concept /*tiny-range*/= | (3) | (exposition only*) |
lazy_split_view
takes a view
and a delimiter, and splits the view
into subranges on the delimiter. Two major scenarios are supported:
- The view is an
input_range
, the delimiter is a single element (wrapped in asingle_view
). - The view is a
forward_range
, the delimiter is aview
of elements.
Pattern
satisfies sized_range
, Pattern::size() is a constant expression and suitable as a template constant argument, and the value of Pattern::size() is less than or equal to 1
. Notably, empty_view
and single_view
satisfy this concept.lazy_split_view
models the concepts forward_range
and input_range
when the underlying view
V
models respective concepts, and models common_range
when V
models both forward_range
and common_range
.
The inner range (ranges::range_reference_t<lazy_split_view>) models the concepts forward_range
and input_range
when the underlying view
V
models respective concepts. It does not model common_range
, and cannot be used with algorithms that expect a bidirectional_range
or higher.
Unlike split_view
, lazy_split_view
does not maintain the continuity of the subrange.
Contents |
[edit]Data members
Member | Description |
V base_ (private) | the underlying view (exposition-only member object*) |
Pattern pattern_ (private) | the pattern that is used as a delimiter to split the underlying view (exposition-only member object*) |
non-propagating-cache<ranges::iterator_t<V>>current_ (private)(present only if V does not satisfy forward_range ) | an object that caches the result of calls to begin() (exposition-only member object*) |
[edit]Member functions
constructs a lazy_split_view (public member function) | |
returns a copy of the underlying (adapted) view (public member function) | |
returns an iterator to the beginning (public member function) | |
returns an iterator or a sentinel to the end (public member function) | |
Inherited from std::ranges::view_interface | |
returns whether the derived view is empty, provided only if it satisfies sized_range or forward_range (public member function of std::ranges::view_interface<D> ) | |
(C++23) | returns a constant iterator to the beginning of the range (public member function of std::ranges::view_interface<D> ) |
(C++23) | returns a sentinel for the constant iterator of the range (public member function of std::ranges::view_interface<D> ) |
returns whether the derived view is not empty, provided only if ranges::empty is applicable to it (public member function of std::ranges::view_interface<D> ) | |
returns the first element in the derived view, provided if it satisfies forward_range (public member function of std::ranges::view_interface<D> ) |
[edit]Nested classes
the iterator type (exposition-only member class template*) | |
the iterator type of the inner range (exposition-only member class template*) |
[edit]Deduction guides
[edit]Notes
The name lazy_split_view
is introduced by the post-C++20 defect report P2210R2. It has the same lazy mechanism as that of the old split_view
before change.
[edit]Example
#include <algorithm>#include <iostream>#include <ranges>#include <string_view> auto print =[](autoconst& view){// `view` is of std::views::lazy_split_view::__outer_iterator::value_type for(std::cout<<"{ ";constauto element : view)std::cout<< element <<' ';std::cout<<"} ";}; int main(){constexprstaticauto source ={0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9};constexprint delimiter{0};constexpr std::ranges::lazy_split_view outer_view{source, delimiter};std::cout<<"splits["<< std::ranges::distance(outer_view)<<"]: ";for(autoconst& inner_view: outer_view) print(inner_view); constexprstd::string_view hello{"Hello C++ 20 !"};std::cout<<"\n""substrings: "; std::ranges::for_each(hello | std::views::lazy_split(' '), print); constexprstd::string_view text{"Hello-+-C++-+-20-+-!"};constexprstd::string_view delim{"-+-"};std::cout<<"\n""substrings: "; std::ranges::for_each(text | std::views::lazy_split(delim), print);}
Output:
splits[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 } substrings: { H e l l o } { C + + } { 2 0 } { ! } substrings: { H e l l o } { C + + } { 2 0 } { ! }
[edit]Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P2210R2 | C++20 | the old split_view was too lazy to be easily used | moves its functionality to lazy_split_view |
[edit]See also
a view over the subranges obtained from splitting another view using a delimiter(class template)(range adaptor object) | |
(C++20) | a view consisting of the sequence obtained from flattening a view of range s(class template)(range adaptor object) |