std::ranges::subrange
From cppreference.com
 
 
 
 
 
 C++ 
 Feature test macros (C++20)
 Concepts library (C++20)
 Metaprogramming library (C++11)
 Ranges library (C++20)
 Filesystem library (C++17)
 Concurrency support library (C++11)
 Execution control library (C++26)
Ranges library 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(exposition-only member object*)
 
(exposition-only member object*)
 
(present only if
(exposition-only member object*)
 
 
 
 
 returns a constant iterator to the beginning of the range 
(public member function of
 
 returns a sentinel for the constant iterator of the range 
(public member function of
 
 
 
 helper class template for defining a 
(class template) [edit]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
	
		
(C++23)(C++23)
  (C++23)(C++23)
(C++23)(C++23)
  (C++26)(C++26)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
  (C++23)(C++23)
(C++23)
(C++23)(C++23)
(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)
    std::ranges::subrange
Defined in header 
 
 
<ranges> 
 template<
 (1) 
 (since C++20) 
    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
Helper concepts
 
 
template<class From, class To>
 (2)
 (exposition only*)
concept /*uses-nonqualification-pointer-conversion*/ =
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
 (3)
 (exposition only*)
concept /*convertible-to-non-slicing*/ = /* see description */;
1) The 
subrange class template combines together an iterator and a sentinel into a single view. It models 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).2) Determines whether 
From is convertible to To without qualification conversions. Equivalent to:
template<class From, class To> concept /*uses-nonqualification-pointer-conversion*/ = std::is_pointer_v <From> && std::is_pointer_v <To> && !std::convertible_to <std::remove_pointer_t <From>(*)[], std::remove_pointer_t <To>(*)[]>;
3) Determines whether 
From is convertible to To without derived-to-base conversion:
template<class From, class To> concept /*convertible-to-non-slicing*/ = std::convertible_to <From, To> && !/*uses-nonqualification-pointer-conversion*/ <std::decay_t <From>, std::decay_t <To>>;
Contents
[edit] Data members
 Member
 Definition
 constexpr bool 
(exposition-only static member constant*)
StoreSize  [static]
 K == ranges::subrange_kind::sized &&    !std::sized_sentinel_for <S, I>(exposition-only static member constant*)
I begin_
 an iterator to the beginning of the subrange(exposition-only member object*)
S end_
 a sentinel denoting the end of the subrange(exposition-only member object*)
make-unsigned-like-t  <std::iter_difference_t <I>> size_ (present only if
StoreSize is true)
 the size of the subrange(exposition-only member object*)
[edit] Member functions
Observers
Iterator operations
 
 obtains a copy of the 
(public member function) [edit]
subrange with its iterator decremented by a given distance (public member function) [edit]
 
 obtains a copy of the 
(public member function) [edit]
subrange with its iterator advanced by a given distance (public member function) [edit]
Inherited from std::ranges::view_interface
(C++23)
(public member function of
std::ranges::view_interface<D>) [edit] 
(C++23)
(public member function of
std::ranges::view_interface<D>) [edit] 
 
 returns whether the derived view is not empty, provided only if ranges::empty  is applicable to it 
(public member function of
(public member function of
std::ranges::view_interface<D>) [edit] 
 
 gets the address of derived view's data, provided only if its iterator type satisfies 
(public member function of
contiguous_iterator (public member function of
std::ranges::view_interface<D>) [edit] 
 
 returns the first element in the derived view, provided if it satisfies 
(public member function of
forward_range (public member function of
std::ranges::view_interface<D>) [edit] 
 
 returns the last element in the derived view, provided only if it satisfies 
(public member function of
bidirectional_range and common_range (public member function of
std::ranges::view_interface<D>) [edit] 
 
 returns the 
(public member function of
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] Non-member functions
[edit] Helper types
 
 obtains the type of the iterator or the sentinel of a std::ranges::subrange 
(class template specialization) [edit]
(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) 
constexpr bool ranges::enable_borrowed_range <ranges::subrange<I, S, K>> = true;
This specialization of ranges::enable_borrowed_range  makes subrange satisfy borrowed_range.
[edit] Example
Run this code
#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] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior | 
|---|---|---|---|
| LWG 3470 | C++20 | convertible-to-non-slicingmight reject qualification conversions | always accepts them | 
[edit] See also
(C++20)
view, using the curiously recurring template pattern (class template) [edit]