std::ranges::subrange - cppreference.com

From cppreference.com

Defined in header

<ranges>

template<std::input_or_output_iteratorI,std::sentinel_for<I>S=I,ranges::subrange_kindK=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>)classsubrange:publicranges::view_interface<subrange<I,S,K>> (1) (since C++20)Helper concepts

template<classFrom,classTo>concept/*uses-nonqualification-pointer-conversion*/=/* see description */; (2)(exposition only*)template<classFrom,classTo>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

qualification conversions

. Equivalent to:

template<classFrom,classTo>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<classFrom,classTo>concept/*convertible-to-non-slicing*/=std::convertible_to<From,To>&&!/*uses-nonqualification-pointer-conversion*/<std::decay_t<From>,std::decay_t<To>>;Data members

Member Description constexprboolStoreSize [static]K==ranges::subrange_kind::sized&&
!std::sized_sentinel_for<S,I>
(exposition-only static member constant*)Ibegin_an iterator to the beginning of the subrange
(exposition-only member object*)Send_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*)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<D>)

[edit]

cend

(C++23)

returns a sentinel for the constant iterator of the range
(public member function of std::ranges::view_interface<D>)

[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<D>)

[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<D>)

[edit]

front

returns the first element in the derived view, provided if it satisfies

forward_range

(public member function of std::ranges::view_interface<D>)

[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<D>)

[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<D>)

[edit]

Deduction guides

Non-member functions

Helper types

Helper templates

template<classI,classS,ranges::subrange_kindK>constexprboolranges::enable_borrowed_range<ranges::subrange<I,S,K>>=true;(since C++20)This specialization of ranges::enable_borrowed_range makes subrange satisfy

borrowed_range

.

Example

Run this code

#include<map>#include<print>#include<ranges>voidmake_uppercase(char&v){v+='A'-'a';}voiduppercase_transform(std::multimap<int,char>&m,intk){auto[first,last]=m.equal_range(k);for(auto&[_,v]:std::ranges::subrange(first,last))make_uppercase(v);}intmain(){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: '-'} 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 See also

External links