std::ranges::subrange - cppreference.com (original) (raw)

Defined in header
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>> (1)
Helper concepts
template<class From, class To> concept /*uses-nonqualification-pointer-conversion*/ = /* see description */; (2) (exposition only*)
template<class From, class To>concept /*convertible-to-non-slicing*/ = /* see description */; (3) (exposition only*)
  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 derived-to-base conversion:

Contents

[edit] Data members

Member Definition
constexpr bool 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

(constructor) creates a new subrange (public member function)
operator PairLike converts the subrange to a pair-like type (public member function) [edit]
Observers
begin obtains the iterator (public member function) [edit]
end obtains the sentinel (public member function) [edit]
empty checks whether the subrange is empty (public member function) [edit]
size obtains the size of the subrange (public member function) [edit]
Iterator operations
advance advances the iterator by given distance (public member function) [edit]
prev obtains a copy of the subrange with its iterator decremented by a given distance (public member function) [edit]
next obtains a copy of the subrange with its iterator advanced by a given distance (public member function) [edit]
Inherited from std::ranges::view_interface
cbegin(C++23) returns a constant iterator to the beginning of the range (public member function of std::ranges::view_interface) [edit]
cend(C++23) returns a sentinel for the constant iterator of the range (public member function of std::ranges::view_interface) [edit]
operator bool 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) [edit]
data gets the address of derived view's data, provided only if its iterator type satisfies contiguous_iterator (public member function of std::ranges::view_interface) [edit]
front returns the first element in the derived view, provided if it satisfies forward_range (public member function of std::ranges::view_interface) [edit]
back returns the last element in the derived view, provided only if it satisfies bidirectional_range and common_range (public member function of std::ranges::view_interface) [edit]
operator[] returns the nth element in the derived view, provided only if it satisfies random_access_range (public member function of std::ranges::view_interface) [edit]

[edit] Deduction guides

[edit] Non-member functions

[edit] Helper types

[edit] Helper templates

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

[edit] Example

#include #include #include   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