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 | | (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*) |
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).Determines whether
From
is convertible toTo
without derived-to-base conversion:
Contents
- 1 Data members
- 2 Member functions
- 3 Deduction guides
- 4 Non-member functions
- 5 Helper types
- 6 Helper templates
- 7 Example
- 8 Defect reports
- 9 See also
- 10 External links
[edit] Data members
Member | Definition |
---|---|
constexpr bool StoreSize [static] | K == ranges::subrange_kind::sized && |
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 |