Namespaces
Variants
Views
Actions

std::ranges::subrange

From cppreference.com
< cpp‎ | ranges
 
 
Ranges library
Views
subrange

Range adaptors
 
 
Defined in header <ranges>
template<

    std::input_or_output_iterator I,
    std::sentinel_for<I> S = I,
    ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
        ranges::subrange_kind::sized : ranges::subrange_kind::unsized >
    requires (K == ranges::subrange_kind::sized || !std::sized_sentinel_for<S, I>)
class subrange

    : public ranges::view_interface<subrange<I, S, K>>
(since C++20)

The subrange class template combines together an iterator and a sentinel into a single view.

Additionally, the subrange is a sized_range whenever the final template parameter is subrange_kind​::​sized (which happens when std::sized_sentinel_for<S, I> is satisfied or when size is passed explicitly as a constructor argument).

Contents

[edit] Member constants

Constant name Definition
bool StoreSize (private) [static] K == ranges::subrange_kind::sized && !std::sized_sentinel_for<S, I>
(exposition-only static member constant*)

[edit] Data members

Member name Definition
begin_ (private) an iterator of type I
(exposition-only member object*)
end_ (private) a sentinel of type S
(exposition-only member object*)
size_ (private)
(conditionally present)
the subrange's size value of type /*make-unsigned-like-t*/<std::iter_difference_t<I>>;
present only if StoreSize is true.
(exposition-only member object*)

[edit] Member functions

creates a new subrange
(public member function)
converts the subrange to a pair-like type
(public member function) [edit]
Observers
obtains the iterator
(public member function) [edit]
obtains the sentinel
(public member function) [edit]
checks whether the subrange is empty
(public member function) [edit]
obtains the size of the subrange
(public member function) [edit]
Iterator operations
advances the iterator by given distance
(public member function) [edit]
obtains a copy of the subrange with its iterator decremented by a given distance
(public member function) [edit]
obtains a copy of the subrange with its iterator advanced by a given distance
(public member function) [edit]
Inherited from std::ranges::view_interface
(C++23)
returns a constant iterator to the beginning of the range.
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
returns a sentinel for the constant iterator of the 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]
gets the address of derived view's data. Provided if its iterator type satisfies contiguous_iterator.
(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]
returns the last element in the derived view. Provided if it satisfies bidirectional_range and common_range.
(public member function of std::ranges::view_interface<D>) [edit]
returns the nth element in the derived view. Provided if it satisfies random_access_range.
(public member function of std::ranges::view_interface<D>) [edit]

[edit] Deduction guides

[edit] Non-member functions

obtains iterator or sentinel from a std::ranges::subrange
(function template) [edit]

[edit] Helper types

specifies whether a std::ranges::subrange models std::ranges::sized_range
(enum) [edit]
obtains the number of components of a std::ranges::subrange
(class template specialization) [edit]
obtains the type of the iterator or the sentinel of a std::ranges::subrange
(class template specialization) [edit]

[edit] Helper templates

template< class I, class S, ranges::subrange_kind K >
constexpr bool ranges::enable_borrowed_range<ranges::subrange<I, S, K>> = true;
(since C++20)

This specialization of ranges::enable_borrowed_range makes subrange satisfy borrowed_range.

[edit] Example

#include <map>
#include <print>
#include <ranges>
 
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
 
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
 
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

Output:

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

[edit] See also

helper class template for defining a view, using the curiously recurring template pattern
(class template) [edit]

[edit] External links

Read/write all values of a std::multimap with a given key in C++20 — SO