std::ranges::views::split, std::ranges::split_view

< cpp‎ | ranges
Defined in header <ranges>
template< ranges::forward_range V, ranges::forward_range Pattern >

requires ranges::view<V> && ranges::view<Pattern> &&
  std::indirectly_comparable<ranges::iterator_t<V>, ranges::iterator_t<Pattern>,

class split_view : public ranges::view_interface<split_view<V, Pattern>>
(1) (since C++20)
namespace views {

    inline constexpr /*unspecified*/ split = /*unspecified*/;

(2) (since C++20)

1) split_view takes a view and a delimiter, and splits the view into subranges on the delimiter.
2) Ranges adaptor object. The expression views::split(e, p) is expression-equivalent to split_view(e, p) for any suitable subexpressions e and p.

split_view models the concepts forward_range, and common_range when the underlying view V models respective concepts.

The inner range (ranges::range_reference_t<split_view>) is a ranges::subrange<ranges::iterator_t<V>>, which models the concepts common_range, models sized_range when ranges::iterator_t<V> models std::sized_sentinel_for<ranges::iterator_t<V>>, and models contiguous_range, random_access_range, bidirectional_range, and forward_range when V models respective concepts.


[edit] Expression-equivalent

Expression e is expression-equivalent to expression f, if e and f have the same effects, either are both potentially-throwing or are both not potentially-throwing (i.e. noexcept(e) == noexcept(f)), and either are both constant subexpressions or are both not constant subexpressions.

[edit] Data members

Typical implementations of split_view hold three non-static data members:

  • the underlying view of type V (shown here as base_ for exposition only), and
  • the pattern (shown here as pattern_ for exposition only) that is used as a delimiter to split the underlying view.
  • an object equivalent to std::optional<ranges::subrange<ranges::iterator_t<V>>> (shown here as cached_begin_ for exposition only) that caches the result of a first call to begin().

[edit] Member functions

constructs a split_view
(public member function) [edit]
returns a copy of the underlying (adapted) view
(public member function) [edit]
returns an iterator to the beginning
(public member function) [edit]
returns an iterator or a sentinel to the end
(public member function) [edit]
searches for the next occurrence of the pattern
(exposition-only member function)
Inherited from std::ranges::view_interface
Returns whether the derived view is empty. Provided if it satisfies forward_range.
(public member function of std::ranges::view_interface<D>) [edit]
Returns whether the derived view is not empty. Provided if ranges::empty is applicable to it.
(public member function of std::ranges::view_interface<D>) [edit]
Returns the first element in the derived view. Provided if it satisfies forward_range.
(public member function of std::ranges::view_interface<D>) [edit]

[edit] Nested classes

the iterator type
(exposition-only member class)
the sentinel type
(exposition-only member class)

[edit] Deduction guides

[edit] Notes

[edit] Example

A link to check the example: wandbox

#include <iostream>
#include <iomanip>
#include <ranges>
#include <string_view>
int main() {
    constexpr std::string_view words{"Hello-_-C++-_-23-_-!"};
    constexpr std::string_view delim{"-_-"};
    for (const std::string_view word : std::views::split(words, delim)) {
        std::cout << std::quoted(word) << ' ';


"Hello" "C++" "23" "!"

[edit] See also

a view over the subranges obtained from splitting another view using a delimiter
(class template) (range adaptor object) [edit]
a view consisting of the sequence obtained from flattening a view of ranges
(class template) (range adaptor object) [edit]