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
n
th 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-slicing might reject qualification conversions
|
always accepts them |
[edit] See also
(C++20)
view
, using the curiously recurring template pattern (class template) [edit]