Archivo de encabezado de la biblioteca estándar <ranges>
De cppreference.com
Este encabezado es parte de la bibloteca de ranges.
[editar]Alias de espacios de nombres
namespace std { namespace views = ranges::views; | ||
El alias del espacio de nombres std::views
se proporciona como una abreviatura de std::ranges::views
.
Conceptos | |
Conceptos de rangos | |
Definido en el espacio de nombres std::ranges | |
Especifica que un tipo es un rango. Es decir, proporciona un iterador begin y un centinela end . (concepto) | |
(C++20) | Especifica que un tipo es un rango (range ) e iteradores obtenidos a partir de una expresión de él pueden devolverse de forma segura sin peligro de que queden pendientes. (concepto) |
Especifica que un rango conoce su tamaño en tiempo constante. (concepto) | |
Especifica que un rango es una vista. Es decir, realiza copia, movimiento y asignación en tiempo constante. (concepto) | |
Especifica un rango cuyo tipo de iterador satisface a input_iterator . (concepto) | |
Especifica un rango cuyo tipo de iterador satisface a output_iterator . (concepto) | |
Especifica un rango cuyo tipo de iterador satisface a forward_iterator . (concepto) | |
Especifica un rango cuyo tipo de iterador satisface a bidirectional_iterator . (concepto) | |
Especifica un rango cuyo tipo de iterador satisface a random_access_iterator . (concepto) | |
Especifica un rango cuyo tipo de iterador satisface a contiguous_iterator . (concepto) | |
Especifica que un rango tiene tipos de iterador y centinela idénticos. (concepto) | |
Especifica los requerimientos para un rango (range ) para que sea convertible de forma segura a una vista (view ). (concepto) | |
Clases | |
Primitivas de rangos | |
Definido en el espacio de nombres std::ranges | |
Obtiene los tipos asociados de un rango. (plantilla de alias) | |
Vistas | |
Definido en el espacio de nombres std::ranges | |
(C++20) | Plantilla de clase auxiliar para definir una vista (view ), usando el patrón de plantilla curiosamente recurrente (CRTP). (plantilla de clase) |
(C++20) | Combina un par iterador-centinela en una vista (view ). (plantilla de clase) |
Manejo de iteradores pendientes | |
Definido en el espacio de nombres std::ranges | |
(C++20) | Un tipo marcador de posición que indica que un iterador o un subrango (subrange ) no debe devolverse ya que quedaría pendiente. (clase) |
Obtiene el tipo iterador o tipo subrango (subrange ) de un rango prestado (borrowed_range ). (plantilla de alias) | |
Fábricas | |
Definido en el espacio de nombres std::ranges | |
Una vista (view ) sin elementos. (plantilla de clase)(plantilla de variables) | |
Una vista (view ) que contiene un solo elemento de un valor específico. (plantilla de clase)(objeto punto de personalización) | |
(C++20) | Una vista (view ) que consiste en una secuencia generada al incrementar repetidamente un valor inicial. (plantilla de clase)(objeto punto de personalización) |
Una vista (view ) que consiste en los elementos obtenidos mediante la aplicación sucesiva del operador de extracción (operator>>) sobre el flujo de entrada asociado. (plantilla de clase)(objeto punto de personalización) | |
Adaptadores | |
Definido en el espacio de nombres std::ranges | |
(C++20) | Una vista (view ) que incluye todos los elementos de un rango (range ). (plantilla de alias)(objeto adaptador de rango) |
(C++20) | Una vista (view ) de los elementos de algún otro rango (range ). (plantilla de clase) |
(C++20) | Una vista (view ) con propiedad única de algún rango (range ). (plantilla de clase) |
Una vista (view ) que consiste en los elementos de un rango (range ) que satisface un predicado. (plantilla de clase)(objeto adaptador de rango) | |
Una vista (view ) de una secuencia que aplica una función de transformación a cada elemento. (plantilla de clase)(objeto adaptador de rango) | |
(C++20) | Una vista (view ) que consiste de los primeros N elementos de otra vista. (plantilla de clase)(objeto adaptador de rango) |
Una vista (view ) que consiste en los elementos iniciales de otra vista, hasta el primer elemento sobre el que un predicado devuelva falso. (plantilla de clase)(objeto adaptador de rango) | |
(C++20) | Una vista (view ) que consiste en los elementos de otra vista, saltándose los primeros N elementos. (plantilla de clase)(objeto adaptador de rango) |
Una vista (view ) que consiste en los elementos de otra vista, saltándose la subsecuencia inicial de elementos hasta el primer elemento donde el predicado devuelva falso. (plantilla de clase)(objeto adaptador de rango) | |
(C++20) | Una vista (view ) que consiste en la secuencia obtenida al aplanar una vista de rangos (range ). (plantilla de clase)(objeto adaptador de rango) |
Una vista (view ) sobre los subrangos obtenidos al separar otra vista (view ) usando un delimitador. (plantilla de clase)(objeto adaptador de rango) | |
Una vista (view ) sobre los subrangos obtenidos al dividir otra vista usando un delimitador. (plantilla de clase)(objeto adaptador de rango) | |
(C++20) | Crea un subrango a partir de un iterador y una cuenta. (objeto punto de personalización) |
Convierte una vista (view ) a un rango común (common_range ). (plantilla de clase)(objeto adaptador de rango) | |
Una vista (view ) que itera sobre los elementos de otra vista bidirectional en orden inverso. (plantilla de clase)(objeto adaptador de rango) | |
Toma una vista (view ) que consiste en valores similares a tuplas y a un número N y produce una vista del N-ésimo elemento de cada tupla. (plantilla de clase)(objeto adaptador de rango) | |
(C++20) | Toma una vista (view ) que consiste en valores similares a pares y produce una vista de los primeros elementos de cada par. (plantilla de clase)(objeto adaptador de rango) |
Toma una vista (view ) que consiste valores similares a pares y produce una vista de los segundos elementos de cada par. (plantilla de clase)(objeto adaptador de rango) | |
(C++23) | Una vista (view ) que consiste en tuplas o referencias a elementos correspondientes de las vistas adaptadas. (plantilla de clase)(objeto punto de personalización) |
Una vista (view ) que consiste en tuplas del resultado de aplicar una función de transformación a los elementos correspondientes de las vistas adaptadas. (plantilla de clase)(objeto punto de personalización) | |
Una vista (view ) que consiste en tuplas de referencias a elementos adyacentes de la vista adaptada. (plantilla de clase)(objeto adaptador de rango) | |
Una vista (vista) que consiste en tuplas del resultado de aplicar una función de transformación a elementos adyacentes de la vista adaptada. (plantilla de clase)(objeto adaptador de rango) | |
Objetos de punto de personalización | |
Acceso a rangos | |
Definido en el espacio de nombres std::ranges | |
(C++20) | Devuelve un iterador al principio de un rango. (objeto punto de personalización) |
(C++20) | Devuelve un iterador al final de un rango (objeto punto de personalización) |
(C++20) | Devuelve un iterador al inicio de un rango de solo lectura. (objeto punto de personalización) |
(C++20) | Devuelve un centinela que indica el fin de un rango de solo lectura (objeto punto de personalización) |
(C++20) | Devuelve un iterador inverso a un rango (objeto punto de personalización) |
(C++20) | Devuelve un iterador final inverso a un rango (objeto punto de personalización) |
(C++20) | Devuelve un iterador inverso a un rango de solo lectura (objeto punto de personalización) |
(C++20) | Devuelve un iterador inverso al final de un rango de solo lectura (objeto punto de personalización) |
(C++20) | Obtiene el tamaño de un rango cuyo tamaño puede calcularse en tiempo constante. (objeto punto de personalización) |
(C++20) | Obtiene el tamaño de un rango cuyo tamaño puede calcularse en tiempo constante y lo convierte a un entero con signo. (objeto punto de personalización) |
(C++20) | Comprueba si un rango está vacío. (objeto punto de personalización) |
(C++20) | Obtiene un puntero al principio de un rango contiguo (objeto punto de personalización) |
(C++20) | Obtiene un puntero al inicio de un rango contiguo de solo lectura (objeto punto de personalización) |
Enumeraciones | |
Definido en el espacio de nombres std::ranges | |
(C++20) | Especifica si un subrango (std::ranges::subrange) modela std::ranges::sized_range. (enum) |
[editar]Sinopsis
#include <compare>#include <initializer_list>#include <iterator> namespace std::ranges{inlinenamespace/* no especificado */{// range accessinlineconstexpr/* no especificado */ begin =/* no especificado */;inlineconstexpr/* no especificado */ end =/* no especificado */;inlineconstexpr/* no especificado */ cbegin =/* no especificado */;inlineconstexpr/* no especificado */ cend =/* no especificado */;inlineconstexpr/* no especificado */ rbegin =/* no especificado */;inlineconstexpr/* no especificado */ rend =/* no especificado */;inlineconstexpr/* no especificado */ crbegin =/* no especificado */;inlineconstexpr/* no especificado */ crend =/* no especificado */; inlineconstexpr/* no especificado */ size =/* no especificado */;inlineconstexpr/* no especificado */ ssize =/* no especificado */;inlineconstexpr/* no especificado */ empty =/* no especificado */;inlineconstexpr/* no especificado */ data =/* no especificado */;inlineconstexpr/* no especificado */ cdata =/* no especificado */;} // rangestemplate<class T> concept range =/* véase descripción */; template<class T>inlineconstexprbool enable_borrowed_range =false; template<class T> concept borrowed_range =/* véase descripción */; template<class T>using iterator_t = decltype(ranges::begin(declval<T&>()));template<range R>using sentinel_t = decltype(ranges::end(declval<R&>()));template<range R>using range_difference_t = iter_difference_t<iterator_t<R>>;template<sized_range R>using range_size_t = decltype(ranges::size(declval<R&>()));template<range R>using range_value_t = iter_value_t<iterator_t<R>>;template<range R>using range_reference_t = iter_reference_t<iterator_t<R>>;template<range R>using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>; // rangos con tamañotemplate<class>inlineconstexprbool disable_sized_range =false; template<class T> concept sized_range =/* véase descripción */; // vistastemplate<class T>inlineconstexprbool enable_view =/* véase descripción */; struct view_base {}; template<class T> concept view =/* véase descripción */; // otros refinamientos de rangostemplate<class R, class T> concept output_range =/* véase descripción */; template<class T> concept input_range =/* véase descripción */; template<class T> concept forward_range =/* véase descripción */; template<class T> concept bidirectional_range =/* véase descripción */; template<class T> concept random_access_range =/* véase descripción */; template<class T> concept contiguous_range =/* véase descripción */; template<class T> concept common_range =/* véase descripción */; template<class T> concept viewable_range =/* véase descripción */; // plantilla de clase view_interfacetemplate<class D> requires is_class_v<D>&& same_as<D, remove_cv_t<D>>class view_interface; // subrangosenumclass subrange_kind :bool{ unsized, sized }; template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K =/* véase descripción */> requires (K == subrange_kind::sized||!sized_sentinel_for<S, I>)class subrange; template<class I, class S, subrange_kind K>inlineconstexprbool enable_borrowed_range<subrange<I, S, K>>=true; // manejo de iteradores pendientesstruct dangling; template<range R>using borrowed_iterator_t =/* véase descripción */; template<range R>using borrowed_subrange_t =/* véase descripción */; // vista vacíatemplate<class T> requires is_object_v<T>class empty_view; template<class T>inlineconstexprbool enable_borrowed_range<empty_view<T>>=true; namespace views {template<class T>inlineconstexpr empty_view<T> empty{};} // vista únicatemplate<copy_constructible T> requires is_object_v<T>class single_view; namespace views {inlineconstexpr/* no especificado */ single =/* no especificado */;} template<bool Const, class T>using/*maybe_const*/= conditional_t<Const, const T, T>;// solo exposición // vista iotatemplate<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> requires /*weakly_equality_comparable_with*/<W, Bound>&& copyable<W>class iota_view; template<class W, class Bound>inlineconstexprbool enable_borrowed_range<iota_view<W, Bound>>=true; namespace views {inlineconstexpr/* no especificado */ iota =/* no especificado */;} // istream viewtemplate<movable Val, class CharT, class Traits = char_traits<CharT>> requires /* véase descripción */class basic_istream_view;template<class Val>using istream_view = basic_istream_view<Val, char>;template<class Val>using wistream_view = basic_istream_view<Val, wchar_t>; namespace views {template<class T>inlineconstexpr/* no especificado */ istream =/* no especificado */;} // vista allnamespace views {inlineconstexpr/* no especificado */ all =/* no especificado */; template<viewable_range R>using all_t = decltype(all(declval<R>()));} template<range R> requires is_object_v<R>class ref_view; template<class T>inlineconstexprbool enable_borrowed_range<ref_view<T>>=true; // vista owning_view template<range R> requires /* véase descripción */class owning_view; template<class T>inlineconstexprbool enable_borrowed_range<owning_view<T>>= enable_borrowed_range<T>;// vista filter_viewtemplate<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view; namespace views {inlineconstexpr/* no especificado */ filter =/* no especificado */;} // vista transform_viewtemplate<input_range V, copy_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&&/*can_reference*/<invoke_result_t<F&, range_reference_t<V>>>class transform_view; namespace views {inlineconstexpr/* no especificado */ transform =/* no especificado */;} // vista take_viewtemplate<view>class take_view; template<class T>inlineconstexprbool enable_borrowed_range<take_view<T>>= enable_borrowed_range<T>; namespace views {inlineconstexpr/* no especificado */ take =/* no especificado */;} // vista take_while_viewtemplate<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class take_while_view; namespace views {inlineconstexpr/* no especificado */ take_while =/* no especificado */;} // vista drop_viewtemplate<view V>class drop_view; template<class T>inlineconstexprbool enable_borrowed_range<drop_view<T>>= enable_borrowed_range<T>; namespace views {inlineconstexpr/* no especificado */ drop =/* no especificado */;} // vista drop_while_viewtemplate<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class drop_while_view; template<class T, class Pred>inlineconstexprbool enable_borrowed_range<drop_while_view<T, Pred>>= enable_borrowed_range<T>; namespace views {inlineconstexpr/* no especificado */ drop_while =/* no especificado */;} // vista join_viewtemplate<input_range V> requires view<V>&& input_range<range_reference_t<V>>class join_view; namespace views {inlineconstexpr/* no especificado */ join =/* no especificado */;} // vista lazy_split_viewtemplate<class R> concept /*tiny_range*/=/* véase descripción */;// solo exposición template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>||/*tiny_range*/<Pattern>)class lazy_split_view; // vista split_viewtemplate<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>class split_view; namespace views {inlineconstexpr/* no especificado */ lazy_split =/* no especificado */;inlineconstexpr/* no especificado */ split =/* no especificado */;} // vista countednamespace views {inlineconstexpr/* no especificado */ counted =/* no especificado */;} // vista common_viewtemplate<view V> requires (!common_range<V>&& copyable<iterator_t<V>>)class common_view; template<class T>inlineconstexprbool enable_borrowed_range<common_view<T>>= enable_borrowed_range<T>; namespace views {inlineconstexpr/* no especificado */ common =/* no especificado */;} // vista reverse_viewtemplate<view V> requires bidirectional_range<V>class reverse_view; template<class T>inlineconstexprbool enable_borrowed_range<reverse_view<T>>= enable_borrowed_range<T>; namespace views {inlineconstexpr/* no especificado */ reverse =/* no especificado */;} // vista elements_viewtemplate<input_range V, size_t N> requires /* véase descripción */class elements_view; template<class T, size_t N>inlineconstexprbool enable_borrowed_range<elements_view<T, N>>= enable_borrowed_range<T>; template<class R>using keys_view = elements_view<R, 0>;template<class R>using values_view = elements_view<R, 1>; namespace views {template<size_t N>inlineconstexpr/* no especificado */ elements =/* no especificado */;inlineconstexprauto keys = elements<0>;inlineconstexprauto values = elements<1>;} // vista zip_viewtemplate<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)class zip_view; template<class... Views>inlineconstexprbool enable_borrowed_range<zip_view<Views...>>=(enable_borrowed_range<Views>&& ...); namespace views {inlineconstexpr/* no especificado */ zip =/* no especificado */;} // vista zip_transform_viewtemplate<copy_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&&/*can_reference*/<invoke_result_t<F&, range_reference_t<Views>...>>class zip_transform_view; namespace views {inlineconstexpr/* no especificado */ zip_transform =/* no especificado */;} // vista adjacent_viewtemplate<forward_range V, size_t N> requires view<V>&&(N >0)class adjacent_view; template<class V, size_t N>inlineconstexprbool enable_borrowed_range<adjacent_view<V, N>>= enable_borrowed_range<V>; namespace views {template<size_t N>inlineconstexpr/* no especificado */ adjacent =/* no especificado */;inlineconstexprauto pairwise = adjacent<2>;} // vista adjacent_transform_viewtemplate<forward_range V, copy_constructible F, size_t N> requires /* véase descripción */class adjacent_transform_view; namespace views {template<size_t N>inlineconstexpr/* no especificado */ adjacent_transform =/* no especificado */;inlineconstexprauto pairwise_transform = adjacent_transform<2>;}} namespace std {namespace views = ranges::views; template<class T>struct tuple_size;template<size_t I, class T>struct tuple_element; template<class I, class S, ranges::subrange_kind K>struct tuple_size<ranges::subrange<I, S, K>>: integral_constant<size_t, 2>{};template<class I, class S, ranges::subrange_kind K>struct tuple_element<0, ranges::subrange<I, S, K>>{using type = I;};template<class I, class S, ranges::subrange_kind K>struct tuple_element<1, ranges::subrange<I, S, K>>{using type = S;};template<class I, class S, ranges::subrange_kind K>struct tuple_element<0, constranges::subrange<I, S, K>>{using type = I;};template<class I, class S, ranges::subrange_kind K>struct tuple_element<1, constranges::subrange<I, S, K>>{using type = S;};}
[editar]Concepto range
namespace std::ranges{template<class T > concept range = requires(T& t){ranges::begin(t);// conservador de la igualdad para iteradores de avanceranges::end(t);};}
[editar]Concepto sized_range
namespace std::ranges{template<class T > concept sized_range = range<T>&& requires(T& t){ranges::size(t);};}
[editar]Concepto view
namespace std::ranges{template<class T>inlineconstexprbool enable_view = derived_from<T, view_base>; template<class T> concept view = range<T>&& movable<T>&& enable_view<T>;}
[editar]Concepto output_range
namespace std::ranges{template<class R, class T> concept output_range = range<R>&& output_iterator<iterator_t<R>, T>;}
[editar]Concepto input_range
namespace std::ranges{template<class T> concept input_range = range<T>&& input_iterator<iterator_t<T>>;}
[editar]Concepto forward_range
namespace std::ranges{template<class T> concept forward_range = input_range<T>&& forward_iterator<iterator_t<T>>;}
[editar]Concepto bidirectional_range
namespace std::ranges{template<class T> concept bidirectional_range = forward_range<T>&& bidirectional_iterator<iterator_t<T>>;}
[editar]Concepto random_access_range
namespace std::ranges{template<class T> concept random_access_range = bidirectional_range<T>&& random_access_iterator<iterator_t<T>>;}
[editar]Concepto contiguous_range
namespace std::ranges{template<class T> concept contiguous_range = random_access_range<T>&& contiguous_iterator<iterator_t<T>>&& requires(T& t){{ranges::data(t)}-> same_as<add_pointer_t<range_reference_t<T>>>;};}
[editar]Concepto common_range
namespace std::ranges{template<class T> concept common_range = range<T>&& same_as<iterator_t<T>, sentinel_t<T>>;}
[editar]Concepto viewable_range
namespace std::ranges{template<class T> concept viewable_range = range<T>&&(borrowed_range<T>|| view<remove_cvref_t<T>>);}
[editar]Conceptos auxiliares
namespace std::ranges{// no especificado, solo para la búsqueda de nombretemplate<class R> concept __SimpleView =// solo exposición view<R>&& range<const R>&& same_as<iterator_t<R>, iterator_t<const R>>&& same_as<sentinel_t<R>, sentinel_t<const R>>; template<input_iterator I> concept __HasArrow =// solo exposición is_pointer_v<I>|| requires(I i){ i.operator->();}; template<class T, class U> concept __DifferentFrom =// solo exposición!same_as<remove_cvref_t<T>, remove_cvref_t<U>>; template<class I> concept __Decrementable =// solo exposición __Incrementable<I>&& requires(I i){{--i }-> same_as<I&>;{ i--}-> same_as<I>;}; template<class I> concept __Advanceable =// solo exposición __Decrementable<I>&& totally_ordered<I>&& requires(I i, const I j, const iter_difference_t<I> n){{ i += n }-> same_as<I&>;{ i -= n }-> same_as<I&>; I { j + n }; I { n + j }; I { j - n };{ j - j }-> convertible_to<iter_difference_t<I>>;};}
Nota: Estos nombres son solo para exposición, no forman parte de la interfaz.
[editar]Plantilla de clase std::ranges::view_interface
namespace std::ranges{template<class D> requires is_class_v<D>&& same_as<D, remove_cv_t<D>>class view_interface :public view_base {private:constexpr D& derived()noexcept{// solo exposiciónreturnstatic_cast<D&>(*this);}constexprconst D& derived()constnoexcept{// solo exposiciónreturnstatic_cast<const D&>(*this);}public:constexprbool empty() requires forward_range<D>{returnranges::begin(derived())==ranges::end(derived());}constexprbool empty()const requires forward_range<const D>{returnranges::begin(derived())==ranges::end(derived());} constexprexplicit operator bool() requires requires {ranges::empty(derived());}{return!ranges::empty(derived());}constexprexplicit operator bool()const requires requires {ranges::empty(derived());}{return!ranges::empty(derived());} constexprauto data() requires contiguous_iterator<iterator_t<D>>{return to_address(ranges::begin(derived()));}constexprauto data()const requires range<const D>&& contiguous_iterator<iterator_t<const D>>{return to_address(ranges::begin(derived()));} constexprauto size() requires forward_range<D>&& sized_sentinel_for<sentinel_t<D>, iterator_t<D>>{returnranges::end(derived())-ranges::begin(derived());}constexprauto size()const requires forward_range<const D>&& sized_sentinel_for<sentinel_t<const D>, iterator_t<const D>>{returnranges::end(derived())-ranges::begin(derived());} constexpr decltype(auto) front() requires forward_range<D>;constexpr decltype(auto) front()const requires forward_range<const D>; constexpr decltype(auto) back() requires bidirectional_range<D>&& common_range<D>;constexpr decltype(auto) back()const requires bidirectional_range<const D>&& common_range<const D>; template<random_access_range R = D>constexpr decltype(auto) operator[](range_difference_t<R> n){returnranges::begin(derived())[n];}template<random_access_range R =const D>constexpr decltype(auto) operator[](range_difference_t<R> n)const{returnranges::begin(derived())[n];}};}
[editar]Plantilla de clase std::ranges::subrange
namespace std::ranges{template<class From, class To> concept __UsesNonqualificationPointerConversion =// solo exposición is_pointer_v<From>&& is_pointer_v<To>&&!convertible_to<remove_pointer_t<From>(*)[], remove_pointer_t<To>(*)[]>; template<class From, class To> concept __ConvertibleToNonSlicing =// solo exposición convertible_to<From, To>&&!__UsesNonqualificationPointerConversion<decay_t<From>, decay_t<To>>; template<class T> concept __PairLike =// solo exposición!is_reference_v<T>&& requires(T t){typename tuple_size<T>::type;// se asegura de que tuple_size<T> esté completo requires derived_from<tuple_size<T>, integral_constant<size_t, 2>>;typename tuple_element_t<0, remove_const_t<T>>;typename tuple_element_t<1, remove_const_t<T>>;{ get<0>(t)}-> convertible_to<const tuple_element_t<0, T>&>;{ get<1>(t)}-> convertible_to<const tuple_element_t<1, T>&>;}; template<class T, class U, class V> concept __PairLikeConvertibleFrom =// solo exposición!range<T>&& __PairLike<T>&& constructible_from<T, U, V>&& __ConvertibleToNonSlicing<U, tuple_element_t<0, T>>&& convertible_to<V, tuple_element_t<1, T>>; template<class T> concept __IteratorSentinelPair =// solo exposición!range<T>&& __PairLike<T>&& sentinel_for<tuple_element_t<1, T>, tuple_element_t<0, T>>; template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = sized_sentinel_for<S, I>? subrange_kind::sized: subrange_kind::unsized> requires (K == subrange_kind::sized||!sized_sentinel_for<S, I>)class subrange :public view_interface<subrange<I, S, K>>{private:staticconstexprbool StoreSize =// solo exposición K == subrange_kind::sized&&!sized_sentinel_for<S, I>; I begin_ = I();// solo exposición S end_ = S();// solo exposición __MakeUnsignedLikeT<iter_difference_t<I>> size_ =0;// solo exposición; solo está presente// cuando StoreSize es verdaderopublic: subrange()=default; constexpr subrange(__ConvertibleToNonSlicing<I>auto i, S s) requires (!StoreSize); constexpr subrange(__ConvertibleToNonSlicing<I>auto i, S s, __MakeUnsignedLikeT<iter_difference_t<I>> n) requires (K == subrange_kind::sized); template<__DifferentFrom<subrange> R> requires borrowed_range<R>&& __ConvertibleToNonSlicing<iterator_t<R>, I>&& convertible_to<sentinel_t<R>, S>constexpr subrange(R&& r) requires (!StoreSize || sized_range<R>); template<borrowed_range R> requires __ConvertibleToNonSlicing<iterator_t<R>, I>&& convertible_to<sentinel_t<R>, S>constexpr subrange(R&& r, __MakeUnsignedLikeT<iter_difference_t<I>> n) requires (K == subrange_kind::sized): subrange{ranges::begin(r), ranges::end(r), n}{} template<__DifferentFrom<subrange> PairLike> requires __PairLikeConvertibleFrom<PairLike, const I&, const S&>constexpr operator PairLike()const; constexpr I begin()const requires copyable<I>;[[nodiscard]]constexpr I begin() requires (!copyable<I>);constexpr S end()const; constexprbool empty()const;constexpr __MakeUnsignedLikeT<iter_difference_t<I>> size()const requires (K == subrange_kind::sized); [[nodiscard]]constexpr subrange next(iter_difference_t<I> n =1)const& requires forward_iterator<I>;[[nodiscard]]constexpr subrange next(iter_difference_t<I> n =1)&&;[[nodiscard]]constexpr subrange prev(iter_difference_t<I> n =1)const requires bidirectional_iterator<I>;constexpr subrange& advance(iter_difference_t<I> n);}; template<input_or_output_iterator I, sentinel_for<I> S> subrange(I, S)-> subrange<I, S>; template<input_or_output_iterator I, sentinel_for<I> S> subrange(I, S, __MakeUnsignedLikeT<iter_difference_t<I>>)-> subrange<I, S, subrange_kind::sized>; template<__IteratorSentinelPair P> subrange(P)-> subrange<tuple_element_t<0, P>, tuple_element_t<1, P>>; template<__IteratorSentinelPair P> subrange(P, __MakeUnsignedLikeT<iter_difference_t<tuple_element_t<0, P>>>)-> subrange<tuple_element_t<0, P>, tuple_element_t<1, P>, subrange_kind::sized>; template<borrowed_range R> subrange(R&&)-> subrange<iterator_t<R>, sentinel_t<R>, (sized_range<R>|| sized_sentinel_for<sentinel_t<R>, iterator_t<R>>)? subrange_kind::sized: subrange_kind::unsized>; template<borrowed_range R> subrange(R&&, __MakeUnsignedLikeT<range_difference_t<R>>)-> subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>; template<size_t N, class I, class S, subrange_kind K> requires (N <2)constexprauto get(const subrange<I, S, K>& r); template<size_t N, class I, class S, subrange_kind K> requires (N <2)constexprauto get(subrange<I, S, K>&& r);} namespace std {usingranges::get;}
[editar]Clase std::ranges::dangling
namespace std::ranges{struct dangling {constexpr dangling()noexcept=default;template<class... Args>constexpr dangling(Args&&...)noexcept{}};}
[editar]Plantilla de clase std::ranges::empty_view
namespace std::ranges{template<class T> requires is_object_v<T>class empty_view :public view_interface<empty_view<T>>{public:staticconstexpr T* begin()noexcept{return nullptr;}staticconstexpr T* end()noexcept{return nullptr;}staticconstexpr T* data()noexcept{return nullptr;}staticconstexpr size_t size()noexcept{return0;}staticconstexprbool empty()noexcept{returntrue;}};}
[editar]Plantilla de clase std::ranges::single_view
namespace std::ranges{template<copy_constructible T> requires is_object_v<T>class single_view :public view_interface<single_view<T>>{private: __SemiregularBox<T> value_;// solo exposiciónpublic: single_view()=default;constexprexplicit single_view(const T& t);constexprexplicit single_view(T&& t);template<class... Args> requires constructible_from<T, Args...>constexpr single_view(in_place_t, Args&&... args); constexpr T* begin()noexcept;constexprconst T* begin()constnoexcept;constexpr T* end()noexcept;constexprconst T* end()constnoexcept;staticconstexpr size_t size()noexcept;constexpr T* data()noexcept;constexprconst T* data()constnoexcept;};}
[editar]Plantilla de clase std::ranges::iota_view
namespace std::ranges{template<class I> concept __Decrementable =// solo exposición/* véase definición */;template<class I> concept __Advanceable =// solo exposición/* véase definición */; template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> requires __WeaklyEqualityComparableWith<W, Bound>&& semiregular<W>class iota_view :public view_interface<iota_view<W, Bound>>{private:// class iota_view::iteratorstruct iterator;// solo exposición// class iota_view::sentinelstruct sentinel;// solo exposición W value_ = W();// solo exposición Bound bound_ = Bound();// solo exposiciónpublic: iota_view()=default;constexprexplicit iota_view(W value);constexpr iota_view(type_identity_t<W> value, type_identity_t<Bound> bound);constexpr iota_view(iterator first, sentinel last): iota_view(*first, last.bound_){} constexpr iterator begin()const;constexprauto end()const;constexpr iterator end()const requires same_as<W, Bound>; constexprauto size()const requires /* véase definición */;}; template<class W, class Bound> requires (!__IsIntegerLike<W>||!__IsIntegerLike<Bound>||(__IsSignedIntegerLike<W>== __IsSignedIntegerLike<Bound>)) iota_view(W, Bound)-> iota_view<W, Bound>;}
[editar]Clase std::ranges::iota_view::iterator
namespace std::ranges{template<weakly_incrementable W, semiregular Bound> requires __WeaklyEqualityComparableWith<W, Bound>struct iota_view<W, Bound>::iterator{private: W value_ = W();// solo exposiciónpublic:using iterator_concept =/* véase definición */;using iterator_category = input_iterator_tag;using value_type = W;using difference_type =/* __iota_difference_t<W> */; iterator()=default;constexprexplicit iterator(W value); constexpr W operator*()constnoexcept(is_nothrow_copy_constructible_v<W>); constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires __Incrementable<W>; constexpr iterator& operator--() requires __Decrementable<W>;constexpr iterator operator--(int) requires __Decrementable<W>; constexpr iterator& operator+=(difference_type n) requires __Advanceable<W>;constexpr iterator& operator-=(difference_type n) requires __Advanceable<W>;constexpr W operator[](difference_type n)const requires __Advanceable<W>; friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<W>; friendconstexprbool operator<(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires totally_ordered<W>&& three_way_comparable<W>; friendconstexpr iterator operator+(iterator i, difference_type n) requires __Advanceable<W>;friendconstexpr iterator operator+(difference_type n, iterator i) requires __Advanceable<W>; friendconstexpr iterator operator-(iterator i, difference_type n) requires __Advanceable<W>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires __Advanceable<W>;};}
[editar]Clase std::ranges::iota_view::sentinel
namespace std::ranges{template<weakly_incrementable W, semiregular Bound> requires __WeaklyEqualityComparableWith<W, Bound>struct iota_view<W, Bound>::sentinel{private: Bound bound_ = Bound();// solo exposiciónpublic: sentinel()=default;constexprexplicit sentinel(Bound bound); friendconstexprbool operator==(const iterator& x, const sentinel& y); friendconstexpr iter_difference_t<W> operator-(const iterator& x, const sentinel& y) requires sized_sentinel_for<Bound, W>;friendconstexpr iter_difference_t<W> operator-(const sentinel& x, const iterator& y) requires sized_sentinel_for<Bound, W>;};}
[editar]Plantilla de clase std::ranges::basic_istream_view
namespace std::ranges{template<class Val, class CharT, class Traits> concept __StreamExtractable =// solo exposición requires(basic_istream<CharT, Traits>& is, Val& t){ is >> t;}; template<movable Val, class CharT, class Traits> requires default_initializable<Val>&& __StreamExtractable<Val, CharT, Traits>class basic_istream_view :public view_interface<basic_istream_view<Val, CharT, Traits>>{public: basic_istream_view()=default;constexprexplicit basic_istream_view(basic_istream<CharT, Traits>& stream); constexprauto begin(){if(stream_){*stream_ >> object_;}return iterator{*this};} constexpr default_sentinel_t end()constnoexcept; private:struct iterator;// solo exposición basic_istream<CharT, Traits>* stream_ = nullptr;// solo exposición Val object_ = Val();// solo exposición};}
[editar]Plantilla de clase std::ranges::basic_istream_view::iterator
namespace std::ranges{template<movable Val, class CharT, class Traits> requires default_initializable<Val>&& __StreamExtractable<Val, CharT, Traits>class basic_istream_view<Val, CharT, Traits>::iterator{// solo exposiciónpublic:using iterator_concept = input_iterator_tag;using difference_type = ptrdiff_t;using value_type = Val; iterator()=default;constexprexplicit iterator(basic_istream_view& parent)noexcept; iterator(const iterator&)= delete; iterator(iterator&&)=default; iterator& operator=(const iterator&)= delete; iterator& operator=(iterator&&)=default; iterator& operator++();void operator++(int); Val& operator*()const; friendbool operator==(const iterator& x, default_sentinel_t); private: basic_istream_view* parent_ = nullptr;// solo exposición};}
[editar]Plantilla de clase std::ranges::ref_view
namespace std::ranges{template<range R> requires is_object_v<R>class ref_view :public view_interface<ref_view<R>>{private: R* r_ = nullptr;// solo exposiciónpublic:constexpr ref_view()noexcept=default; template<__DifferentFrom<ref_view> T> requires /* véase definición */constexpr ref_view(T&& t); constexpr R& base()const{return*r_;} constexpr iterator_t<R> begin()const{returnranges::begin(*r_);}constexpr sentinel_t<R> end()const{returnranges::end(*r_);} constexprbool empty()const requires requires {ranges::empty(*r_);}{returnranges::empty(*r_);} constexprauto size()const requires sized_range<R>{returnranges::size(*r_);} constexprauto data()const requires contiguous_range<R>{returnranges::data(*r_);}};template<class R> ref_view(R&)-> ref_view<R>;}
[editar]Plantilla de clase std::ranges::owning_view
namespace std::ranges{template<range R> requires movable<R>&&(!/*is-initializer-list*/<R>)class owning_view :public view_interface<owning_view<R>>{private: R r_ = R();// solo exposiciónpublic: owning_view() requires default_initializable<R>=default;constexpr owning_view(R&& t); owning_view(owning_view&&)=default; owning_view& operator=(owning_view&&)=default; constexpr R& base()&{return r_;}constexprconst R& base()const&{return r_;}constexpr R&& base()&&{return std::move(r_);}constexprconst R&& base()const&&{return std::move(r_);} constexpr iterator_t<R> begin(){returnranges::begin(r_);}constexpr sentinel_t<R> end(){returnranges::end(r_);} constexpr iterator_t<const R> begin()const requires range<const R>{returnranges::begin(r_);}constexpr sentinel_t<const R> end()const requires range<const R>{returnranges::end(r_);} constexprbool empty() requires requires {ranges::empty(r_);}{returnranges::empty(r_);}constexprbool empty()const requires requires {ranges::empty(r_);}{returnranges::empty(r_);} constexprauto size() requires sized_range<R>{returnranges::size(r_);}constexprauto size()const requires sized_range<const R>{returnranges::size(r_);} constexprauto data() requires contiguous_range<R>{returnranges::data(r_);}constexprauto data()const requires contiguous_range<const R>{returnranges::data(r_);}};}
[editar]Plantilla de clase std::ranges::filter_view
namespace std::ranges{template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view :public view_interface<filter_view<V, Pred>>{private: V base_ = V();// solo exposición __SemiregularBox<Pred> pred_;// solo exposición // class filter_view::iteratorclass iterator;// solo exposición// class filter_view::sentinelclass sentinel;// solo exposición public: filter_view()=default;constexpr filter_view(V base, Pred pred); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprconst Pred& pred()const; constexpr iterator begin();constexprauto end(){ifconstexpr(common_range<V>)return iterator{*this, ranges::end(base_)};elsereturn sentinel{*this};}}; template<class R, class Pred> filter_view(R&&, Pred)-> filter_view<views::all_t<R>, Pred>;}
[editar]Clase std::ranges::filter_view::iterator
namespace std::ranges{template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view<V, Pred>::iterator{private: iterator_t<V> current_ = iterator_t<V>();// solo exposición filter_view* parent_ = nullptr;// solo exposiciónpublic:using iterator_concept =/* véase definición */;using iterator_category =/* véase definición */;using value_type = range_value_t<V>;using difference_type = range_difference_t<V>; iterator()=default;constexpr iterator(filter_view& parent, iterator_t<V> current); constexpr iterator_t<V> base()const& requires copyable<iterator_t<V>>;constexpr iterator_t<V> base()&&;constexpr range_reference_t<V> operator*()const;constexpr iterator_t<V> operator->()const requires __HasArrow<iterator_t<V>>&& copyable<iterator_t<V>>; constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<V>; constexpr iterator& operator--() requires bidirectional_range<V>;constexpr iterator operator--(int) requires bidirectional_range<V>; friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<V>>; friendconstexpr range_rvalue_reference_t<V> iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.current_)));friendconstexprvoid iter_swap(const iterator& x, const iterator& y)noexcept(noexcept(ranges::iter_swap(x.current_, y.current_))) requires indirectly_swappable<iterator_t<V>>;};}
[editar]Clase std::ranges::filter_view::sentinel
namespace std::ranges{template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view<V, Pred>::sentinel{private: sentinel_t<V> end_ = sentinel_t<V>();// solo exposiciónpublic: sentinel()=default;constexprexplicit sentinel(filter_view& parent); constexpr sentinel_t<V> base()const; friendconstexprbool operator==(const iterator& x, const sentinel& y);};}
[editar]Plantilla de clase std::ranges::transform_view
namespace std::ranges{template<input_range V, copy_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __CanReference<invoke_result_t<F&, range_reference_t<V>>>class transform_view :public view_interface<transform_view<V, F>>{private:// plantilla de clase transform_view::iteratortemplate<bool>struct iterator;// solo exposición// plantilla de clase transform_view::sentineltemplate<bool>struct sentinel;// solo exposición V base_ = V();// solo exposición __SemiregularBox<F> fun_;// solo exposición public: transform_view()=default;constexpr transform_view(V base, F fun); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexpr iterator<false> begin();constexpr iterator<true> begin()const requires range<const V>&& regular_invocable<const F&, range_reference_t<const V>>; constexpr sentinel<false> end();constexpr iterator<false> end() requires common_range<V>;constexpr sentinel<true> end()const requires range<const V>&& regular_invocable<const F&, range_reference_t<const V>>;constexpr iterator<true> end()const requires common_range<const V>&& regular_invocable<const F&, range_reference_t<const V>>; constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}}; template<class R, class F> transform_view(R&&, F)-> transform_view<views::all_t<R>, F>;}
[editar]Plantilla de clase std::ranges::transform_view::iterator
namespace std::ranges{template<input_range V, copy_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __CanReference<invoke_result_t<F&, range_reference_t<V>>>template<bool Const>class transform_view<V, F>::iterator{private:using Parent =// solo exposición conditional_t<Const, const transform_view, transform_view>;using Base =// solo exposición conditional_t<Const, const V, V>; iterator_t<Base> current_ =// solo exposición iterator_t<Base>(); Parent* parent_ = nullptr;// solo exposiciónpublic:using iterator_concept =/* véase definición */;using iterator_category =/* véase definición */;using value_type = remove_cvref_t<invoke_result_t<F&, range_reference_t<Base>>>;using difference_type = range_difference_t<Base>; iterator()=default;constexpr iterator(Parent& parent, iterator_t<Base> current);constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>; constexpr iterator_t<Base> base()const& requires copyable<iterator_t<Base>>;constexpr iterator_t<Base> base()&&;constexpr decltype(auto) operator*()const{return invoke(*parent_->fun_, *current_);} constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>; constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>; constexpr iterator& operator+=(difference_type n) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type n) requires random_access_range<Base>;constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>{return invoke(*parent_->fun_, current_[n]);} friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<Base>>; friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>; friendconstexpr iterator operator+(iterator i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, iterator i) requires random_access_range<Base>; friendconstexpr iterator operator-(iterator i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires random_access_range<Base>; friendconstexpr decltype(auto) iter_move(const iterator& i)noexcept(noexcept(invoke(*i.parent_->fun_, *i.current_))){ifconstexpr(is_lvalue_reference_v<decltype(*i)>)return std::move(*i);elsereturn*i;}}
[editar]Plantilla de clase std::ranges::transform_view::sentinel
namespace std::ranges{template<input_range V, copy_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __CanReference<invoke_result_t<F&, range_reference_t<V>>>template<bool Const>class transform_view<V, F>::sentinel{private:using Parent =// solo exposición conditional_t<Const, const transform_view, transform_view>;using Base = conditional_t<Const, const V, V>;// solo exposición sentinel_t<Base> end_ = sentinel_t<Base>();// solo exposiciónpublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end);constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>; constexpr sentinel_t<Base> base()const; friendconstexprbool operator==(const iterator<Const>& x, const sentinel& y); friendconstexpr range_difference_t<Base> operator-(const iterator<Const>& x, const sentinel& y) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;friendconstexpr range_difference_t<Base> operator-(const sentinel& y, const iterator<Const>& x) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;};}
[editar]Plantilla de clase std::ranges::take_view
namespace std::ranges{template<view V>class take_view :public view_interface<take_view<V>>{private: V base_ = V();// solo exposición range_difference_t<V> count_ =0;// solo exposición// plantilla de clase take_view::sentineltemplate<bool>struct sentinel;// solo exposiciónpublic: take_view()=default;constexpr take_view(V base, range_difference_t<V> count); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprauto begin() requires (!__SimpleView<V>){ifconstexpr(sized_range<V>){ifconstexpr(random_access_range<V>)returnranges::begin(base_);else{auto sz = size();return counted_iterator{ranges::begin(base_), sz};}}elsereturn counted_iterator{ranges::begin(base_), count_};} constexprauto begin()const requires range<const V>{ifconstexpr(sized_range<const V>){ifconstexpr(random_access_range<const V>)returnranges::begin(base_);else{auto sz = size();return counted_iterator{ranges::begin(base_), sz};}}elsereturn counted_iterator{ranges::begin(base_), count_};} constexprauto end() requires (!__SimpleView<V>){ifconstexpr(sized_range<V>){ifconstexpr(random_access_range<V>)returnranges::begin(base_)+ size();elsereturn default_sentinel;}elsereturn sentinel<false>{ranges::end(base_)};} constexprauto end()const requires range<const V>{ifconstexpr(sized_range<const V>){ifconstexpr(random_access_range<const V>)returnranges::begin(base_)+ size();elsereturn default_sentinel;}elsereturn sentinel<true>{ranges::end(base_)};} constexprauto size() requires sized_range<V>{auto n =ranges::size(base_);returnranges::min(n, static_cast<decltype(n)>(count_));} constexprauto size()const requires sized_range<const V>{auto n =ranges::size(base_);returnranges::min(n, static_cast<decltype(n)>(count_));}}; template<range R> take_view(R&&, range_difference_t<R>)-> take_view<views::all_t<R>>;}
[editar]Plantilla de clase std::ranges::take_view::sentinel
namespace std::ranges{template<view V>template<bool Const>class take_view<V>::sentinel{private:using Base = conditional_t<Const, const V, V>;// solo exposiciónusing CI = counted_iterator<iterator_t<Base>>;// solo exposición sentinel_t<Base> end_ = sentinel_t<Base>();// solo exposiciónpublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end);constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>; constexpr sentinel_t<Base> base()const; friendconstexprbool operator==(const CI& y, const sentinel& x);};}
[editar]Plantilla de clase std::ranges::take_while_view
namespace std::ranges{template<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class take_while_view :public view_interface<take_while_view<V, Pred>>{// plantilla de clase take_while_view::sentineltemplate<bool>class sentinel;// solo exposición V base_ = V();// solo exposición __SemiregularBox<Pred> pred_;// solo exposición public: take_while_view()=default;constexpr take_while_view(V base, Pred pred); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprconst Pred& pred()const; constexprauto begin() requires (!__SimpleView<V>){returnranges::begin(base_);} constexprauto begin()const requires range<const V>{returnranges::begin(base_);} constexprauto end() requires (!__SimpleView<V>){return sentinel<false>(ranges::end(base_), addressof(*pred_));} constexprauto end()const requires range<const V>{return sentinel<true>(ranges::end(base_), addressof(*pred_));}}; template<class R, class Pred> take_while_view(R&&, Pred)-> take_while_view<views::all_t<R>, Pred>;}
[editar]Plantilla de clase std::ranges::take_while_view::sentinel
namespace std::ranges{template<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>template<bool Const>class take_while_view<V, Pred>::sentinel{// solo exposiciónusing Base = conditional_t<Const, const V, V>;// solo exposición sentinel_t<Base> end_ = sentinel_t<Base>();// solo exposiciónconst Pred* pred_ = nullptr;// solo exposiciónpublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end, const Pred* pred);constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>; constexpr sentinel_t<Base> base()const{return end_;} friendconstexprbool operator==(const iterator_t<Base>& x, const sentinel& y);};}
[editar]Plantilla de clase std::ranges::drop_view
namespace std::ranges{template<view V>class drop_view :public view_interface<drop_view<V>>{public: drop_view()=default;constexpr drop_view(V base, range_difference_t<V> count); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprauto begin() requires (!(__SimpleView<V>&& random_access_range<V>&& sized_range<const V>));constexprauto begin()const requires random_access_range<const V>&& sized_range<const V>; constexprauto end() requires (!__SimpleView<V>){returnranges::end(base_);} constexprauto end()const requires range<const V>{returnranges::end(base_);} constexprauto size() requires sized_range<V>{constauto s =ranges::size(base_);constauto c =static_cast<decltype(s)>(count_);return s < c ?0: s - c;} constexprauto size()const requires sized_range<const V>{constauto s =ranges::size(base_);constauto c =static_cast<decltype(s)>(count_);return s < c ?0: s - c;}private: V base_ = V();// solo exposición range_difference_t<V> count_ =0;// solo exposición}; template<class R> drop_view(R&&, range_difference_t<R>)-> drop_view<views::all_t<R>>;}
[editar]Plantilla de clase std::ranges::drop_while_view
namespace std::ranges{template<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class drop_while_view :public view_interface<drop_while_view<V, Pred>>{public: drop_while_view()=default;constexpr drop_while_view(V base, Pred pred); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprconst Pred& pred()const; constexprauto begin(); constexprauto end(){returnranges::end(base_);} private: V base_ = V();// solo exposición __SemiregularBox<Pred> pred_;// solo exposición}; template<class R, class Pred> drop_while_view(R&&, Pred)-> drop_while_view<views::all_t<R>, Pred>;}
[editar]Plantilla de clase std::ranges::join_view
namespace std::ranges{template<input_range V> requires view<V>&& input_range<range_reference_t<V>>&&(is_reference_v<range_reference_t<V>>|| view<range_value_t<V>>)class join_view :public view_interface<join_view<V>>{private:using InnerRng =// solo exposición range_reference_t<V>;// plantilla de clase join_view::iteratortemplate<bool Const>struct iterator;// solo exposición// plantilla de clase join_view::sentineltemplate<bool Const>struct sentinel;// solo exposición V base_ = V();// solo exposiciónviews::all_t<InnerRng> inner_ =// solo exposición, solo está presenteviews::all_t<InnerRng>();// cuando !is_reference_v<InnerRng>public: join_view()=default;constexprexplicit join_view(V base); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprauto begin(){constexprbool use_const = __SimpleView<V>&& is_reference_v<range_reference_t<V>>;return iterator<use_const>{*this, ranges::begin(base_)};} constexprauto begin()const requires input_range<const V>&& is_reference_v<range_reference_t<const V>>{return iterator<true>{*this, ranges::begin(base_)};} constexprauto end(){ifconstexpr(forward_range<V>&& is_reference_v<InnerRng>&& forward_range<InnerRng>&& common_range<V>&& common_range<InnerRng>)return iterator<__SimpleView<V>>{*this, ranges::end(base_)};elsereturn sentinel<__SimpleView<V>>{*this};} constexprauto end()const requires input_range<const V>&& is_reference_v<range_reference_t<const V>>{ifconstexpr(forward_range<const V>&& is_reference_v<range_reference_t<const V>>&& forward_range<range_reference_t<const V>>&& common_range<const V>&& common_range<range_reference_t<const V>>)return iterator<true>{*this, ranges::end(base_)};elsereturn sentinel<true>{*this};}}; template<class R>explicit join_view(R&&)-> join_view<views::all_t<R>>;}
[editar]Plantilla de clase std::ranges::join_view::iterator
namespace std::ranges{template<input_range V> requires view<V>&& input_range<range_reference_t<V>>&&(is_reference_v<range_reference_t<V>>|| view<range_value_t<V>>)template<bool Const>struct join_view<V>::iterator{private:using Parent =// solo exposición conditional_t<Const, const join_view, join_view>;using Base = conditional_t<Const, const V, V>;// solo exposición staticconstexprbool __RefIsGlvalue =// solo exposición is_reference_v<range_reference_t<Base>>; iterator_t<Base> outer_ = iterator_t<Base>();// solo exposición iterator_t<range_reference_t<Base>> inner_ =// solo exposición iterator_t<range_reference_t<Base>>(); Parent* parent_ = nullptr;// solo exposición constexprvoid satisfy();// solo exposiciónpublic:using iterator_concept =/* véase definición */;using iterator_category =/* véase definición */;using value_type = range_value_t<range_reference_t<Base>>;using difference_type =/* véase definición */; iterator()=default;constexpr iterator(Parent& parent, iterator_t<Base> outer);constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>&& convertible_to<iterator_t<InnerRng>, iterator_t<range_reference_t<Base>>>; constexpr decltype(auto) operator*()const{return*inner_;} constexpr iterator_t<Base> operator->()const requires __HasArrow<iterator_t<Base>>&& copyable<iterator_t<Base>>; constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires __RefIsGlvalue && forward_range<Base>&& forward_range<range_reference_t<Base>>; constexpr iterator& operator--() requires __RefIsGlvalue && bidirectional_range<Base>&& bidirectional_range<range_reference_t<Base>>&& common_range<range_reference_t<Base>>; constexpr iterator operator--(int) requires __RefIsGlvalue && bidirectional_range<Base>&& bidirectional_range<range_reference_t<Base>>&& common_range<range_reference_t<Base>>; friendconstexprbool operator==(const iterator& x, const iterator& y) requires __RefIsGlvalue && equality_comparable<iterator_t<Base>>&& equality_comparable<iterator_t<range_reference_t<Base>>>; friendconstexpr decltype(auto) iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.inner_))){returnranges::iter_move(i.inner_);} friendconstexprvoid iter_swap(const iterator& x, const iterator& y)noexcept(noexcept(ranges::iter_swap(x.inner_, y.inner_)));};}
[editar]Plantilla de clase std::ranges::join_view::sentinel
namespace std::ranges{template<input_range V> requires view<V>&& input_range<range_reference_t<V>>&&(is_reference_v<range_reference_t<V>>|| view<range_value_t<V>>)template<bool Const>struct join_view<V>::sentinel{private:using Parent =// solo exposición conditional_t<Const, const join_view, join_view>;using Base = conditional_t<Const, const V, V>;// solo exposición sentinel_t<Base> end_ = sentinel_t<Base>();// solo exposiciónpublic: sentinel()=default; constexprexplicit sentinel(Parent& parent);constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>; friendconstexprbool operator==(const iterator<Const>& x, const sentinel& y);};}
[editar]Plantilla de clase std::ranges::lazy_split_view
namespace std::ranges{template<auto>struct __RequireConstant;// solo exposición template<class R> concept __TinyRange =// solo exposición sized_range<R>&& requires {typename __RequireConstant<remove_reference_t<R>::size()>;}&&(remove_reference_t<R>::size()<=1); template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __TinyRange<Pattern>)class lazy_split_view :public view_interface<lazy_split_view<V, Pattern>>{private: V base_ = V();// solo exposición Pattern pattern_ = Pattern();// solo exposición __NonPropagatingCache<iterator_t<V>> current_;// solo exposición, solo está presente// if !forward_range<V> // plantilla de clase lazy_split_view::__OuterIteratortemplate<bool>struct __OuterIterator;// solo exposición // plantilla de clase lazy_split_view::__InnerIteratortemplate<bool>struct __InnerIterator;// solo exposición public: lazy_split_view() requires default_initializable<V>&& default_initializable<Pattern>=default;constexpr lazy_split_view(V base, Pattern pattern); template<input_range R> requires constructible_from<V, views::all_t<R>>&& constructible_from<Pattern, single_view<range_value_t<R>>>constexpr lazy_split_view(R&& r, range_value_t<R> e); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprauto begin(){ifconstexpr(forward_range<V>)return __OuterIterator<__SimpleView<V>>{*this, ranges::begin(base_)};else{ current_ =ranges::begin(base_);return __OuterIterator<false>{*this};}} constexprauto begin()const requires forward_range<V>&& forward_range<const V>{return __OuterIterator<true>{*this, ranges::begin(base_)};} constexprauto end() requires forward_range<V>&& common_range<V>{return __OuterIterator<__SimpleView<V>>{*this, ranges::end(base_)};} constexprauto end()const{ifconstexpr(forward_range<V>&& forward_range<const V>&& common_range<const V>)return __OuterIterator<true>{*this, ranges::end(base_)};elsereturn default_sentinel;}}; template<class R, class P> lazy_split_view(R&&, P&&)-> lazy_split_view<views::all_t<R>, views::all_t<P>>; template<input_range R> lazy_split_view(R&&, range_value_t<R>)-> lazy_split_view<views::all_t<R>, single_view<range_value_t<R>>>;}
[editar]Plantilla de clase std::ranges::lazy_split_view::outer_iterator
namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __TinyRange<Pattern>)template<bool Const>struct lazy_split_view<V, Pattern>::__OuterIterator {private:using Parent = __MaybeConst<Const, lazy_split_view>;// solo exposiciónusing Base = __MaybeConst<Const, V>;// solo exposición Parent* parent_ = nullptr;// solo exposición iterator_t<Base> current_ = iterator_t<Base>();// solo exposición, solo está presente// si V modela forward_range bool trailing_empty_ =false;// solo exposición public:using iterator_concept = conditional_t<forward_range<Base>, forward_iterator_tag, input_iterator_tag>; using iterator_category = input_iterator_tag;// solo está presente si Base// modela forward_range // class lazy_split_view::__OuterIterator::value_typestruct value_type;using difference_type = range_difference_t<Base>; __OuterIterator()=default;constexprexplicit __OuterIterator(Parent& parent) requires (!forward_range<Base>);constexpr __OuterIterator(Parent& parent, iterator_t<Base> current) requires forward_range<Base>;constexpr __OuterIterator(__OuterIterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>; constexpr value_type operator*()const; constexpr __OuterIterator& operator++();constexpr decltype(auto) operator++(int){ifconstexpr(forward_range<Base>){auto tmp =*this;++*this;return tmp;}else++*this;} friendconstexprbool operator==(const __OuterIterator& x, const __OuterIterator& y) requires forward_range<Base>; friendconstexprbool operator==(const __OuterIterator& x, default_sentinel_t);};}
[editar]Clase std::ranges::lazy_split_view::outer_iterator::value_type
namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __TinyRange<Pattern>)template<bool Const>struct lazy_split_view<V, Pattern>::__OuterIterator<Const>::value_type: view_interface<value_type>{private: __OuterIterator i_ = __OuterIterator();// solo exposiciónpublic: value_type()=default;constexprexplicit value_type(__OuterIterator i); constexpr __InnerIterator<Const> begin()const;constexpr default_sentinel_t end()const;};}
[editar]Plantilla de clase std::ranges::lazy_split_view::inner_iterator
namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __TinyRange<Pattern>)template<bool Const>struct lazy_split_view<V, Pattern>::__InnerIterator {private:using Base = __MaybeConst<Const, V>;// solo exposición __OuterIterator<Const> i_ = __OuterIterator<Const>();// solo exposiciónbool incremented_ =false;// solo exposición public:using iterator_concept =typename __OuterIterator<Const>::iterator_concept; using iterator_category =/*véase descripción*/;// solo está presente si Base// modela forward_rangeusing value_type = range_value_t<Base>;using difference_type = range_difference_t<Base>; __InnerIterator()=default;constexprexplicit __InnerIterator(__OuterIterator<Const> i); constexprconst iterator_t<Base>& base()const&;constexpr iterator_t<Base> base()&&; constexpr decltype(auto) operator*()const{return*i_.current;} constexpr __InnerIterator& operator++();constexpr decltype(auto) operator++(int){ifconstexpr(forward_range<Base>){auto tmp =*this;++*this;return tmp;}else++*this;} friendconstexprbool operator==(const __InnerIterator& x, const __InnerIterator& y) requires forward_range<Base>; friendconstexprbool operator==(const __InnerIterator& x, default_sentinel_t); friendconstexpr decltype(auto) iter_move(const __InnerIterator& i)noexcept(noexcept(ranges::iter_move(i.i_.current))){returnranges::iter_move(i.i_.current);} friendconstexprvoid iter_swap(const __InnerIterator& x, const __InnerIterator& y)noexcept(noexcept(ranges::iter_swap(x.i_.current, y.i_.current))) requires indirectly_swappable<iterator_t<Base>>;};}
[editar]Plantilla de clase std::ranges::split_view
namespace std::ranges{template<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>class split_view :public view_interface<split_view<V, Pattern>>{private: V base_ = V();// solo exposición Pattern pattern_ = Pattern();// solo exposición// class split_view::iteratorstruct iterator;// solo exposición// class split_view::sentinelstruct sentinel;// solo exposición public: split_view() requires default_initializable<V>&& default_initializable<Pattern>=default;constexpr split_view(V base, Pattern pattern); template<forward_range R> requires constructible_from<V, views::all_t<R>>&& constructible_from<Pattern, single_view<range_value_t<R>>>constexpr split_view(R&& r, range_value_t<R> e); constexpr V base()const& requires copyable<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexpr iterator begin(); constexprauto end(){ifconstexpr(common_range<V>){return iterator{*this, ranges::end(base_), {}};}else{return sentinel{*this};}} constexpr subrange<iterator_t<V>> __FindNext(iterator_t<V>);// solo exposición}; template<class R, class P> split_view(R&&, P&&)-> split_view<views::all_t<R>, views::all_t<P>>; template<forward_range R> split_view(R&&, range_value_t<R>)-> split_view<views::all_t<R>, single_view<range_value_t<R>>>;}
[editar]Plantilla de clase std::ranges::split_view::iterator
namespace std::ranges{template<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>class split_view<V, Pattern>::iterator{private: split_view* parent_ = nullptr;// solo exposición iterator_t<V> cur_ = iterator_t<V>();// solo exposición subrange<iterator_t<V>> next_ = subrange<iterator_t<V>>();// solo exposiciónbool trailing_empty_ =false;// solo exposición public:using iterator_concept = forward_iterator_tag;using iterator_category = input_iterator_tag;using value_type = subrange<iterator_t<V>>;using difference_type = range_difference_t<V>; iterator()=default;constexpr iterator(split_view& parent, iterator_t<V> current, subrange<iterator_t<V>> next); constexpr iterator_t<V> base()const;constexpr value_type operator*()const; constexpr iterator& operator++();constexpr iterator operator++(int); friendconstexprbool operator==(const iterator& x, const iterator& y);};}
[editar]Plantilla de clase std::ranges::split_view::sentinel
namespace std::ranges{template<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>struct split_view<V, Pattern>::sentinel{private: sentinel_t<V> end_ = sentinel_t<V>();// solo exposición public: sentinel()=default;constexprexplicit sentinel(split_view& parent); friendconstexprbool operator==(const iterator& x, const sentinel& y);};}
[editar]Plantilla de clase std::ranges::common_view
namespace std::ranges{template<view V> requires (!common_range<V>&& copyable<iterator_t<V>>)class common_view :public view_interface<common_view<V>>{private: V base_ = V();// solo exposiciónpublic: common_view()=default; constexprexplicit common_view(V r); template<viewable_range R> requires (!common_range<R>&& constructible_from<V, views::all_t<R>>)constexprexplicit common_view(R&& r); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprauto begin(){ifconstexpr(random_access_range<V>&& sized_range<V>)returnranges::begin(base_);elsereturn common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::begin(base_));} constexprauto begin()const requires range<const V>{ifconstexpr(random_access_range<const V>&& sized_range<const V>)returnranges::begin(base_);elsereturn common_iterator<iterator_t<const V>, sentinel_t<const V>>(ranges::begin(base_));} constexprauto end(){ifconstexpr(random_access_range<V>&& sized_range<V>)returnranges::begin(base_)+ranges::size(base_);elsereturn common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::end(base_));} constexprauto end()const requires range<const V>{ifconstexpr(random_access_range<const V>&& sized_range<const V>)returnranges::begin(base_)+ranges::size(base_);elsereturn common_iterator<iterator_t<const V>, sentinel_t<const V>>(ranges::end(base_));} constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}}; template<class R> common_view(R&&)-> common_view<views::all_t<R>>;}
[editar]Plantilla de clase std::ranges::reverse_view
namespace std::ranges{template<view V> requires bidirectional_range<V>class reverse_view :public view_interface<reverse_view<V>>{private: V base_ = V();// solo exposiciónpublic: reverse_view()=default; constexprexplicit reverse_view(V r); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexpr reverse_iterator<iterator_t<V>> begin();constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>;constexprauto begin()const requires common_range<const V>; constexpr reverse_iterator<iterator_t<V>> end();constexprauto end()const requires common_range<const V>; constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}}; template<class R> reverse_view(R&&)-> reverse_view<views::all_t<R>>;}
[editar]Plantilla de clase std::ranges::elements_view
namespace std::ranges{template<class T, size_t N> concept __HasTupleElement =// solo exposición requires(T t){typename tuple_size<T>::type; requires N < tuple_size_v<T>;typename tuple_element_t<N, T>;{ get<N>(t)}-> convertible_to<const tuple_element_t<N, T>&>;}; template<input_range V, size_t N> requires view<V>&& __HasTupleElement<range_value_t<V>, N>&& __HasTupleElement<remove_reference_t<range_reference_t<V>>, N>class elements_view :public view_interface<elements_view<V, N>>{public: elements_view()=default;constexprexplicit elements_view(V base); constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);} constexprauto begin() requires (!__SimpleView<V>){return iterator<false>(ranges::begin(base_));} constexprauto begin()const requires __SimpleView<V>{return iterator<true>(ranges::begin(base_));} constexprauto end(){return sentinel<false>{ranges::end(base_)};} constexprauto end() requires common_range<V>{return iterator<false>{ranges::end(base_)};} constexprauto end()const requires range<const V>{return sentinel<true>{ranges::end(base_)};} constexprauto end()const requires common_range<const V>{return iterator<true>{ranges::end(base_)};} constexprauto size() requires sized_range<V>{returnranges::size(base_);} constexprauto size()const requires sized_range<const V>{returnranges::size(base_);} private:// plantilla de clase elements_view::iteratortemplate<bool>struct iterator;// solo exposición// plantilla de clase elements_view::sentineltemplate<bool>struct sentinel;// solo exposición V base_ = V();// solo exposición};}
[editar]Plantilla de clase std::ranges::elements_view::iterator
namespace std::ranges{template<input_range V, size_t N> requires view<V>&& __HasTupleElement<range_value_t<V>, N>&& __HasTupleElement<remove_reference_t<range_reference_t<V>>, N>template<bool Const>class elements_view<V, N>::iterator{// solo exposiciónusing Base = conditional_t<Const, const V, V>;// solo exposición iterator_t<Base> current_ = iterator_t<Base>();public:using iterator_category =typename iterator_traits<iterator_t<Base>>::iterator_category;using value_type = remove_cvref_t<tuple_element_t<N, range_value_t<Base>>>;using difference_type = range_difference_t<Base>; iterator()=default;constexprexplicit iterator(iterator_t<Base> current);constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>; constexpr iterator_t<Base> base()const& requires copyable<iterator_t<Base>>;constexpr iterator_t<Base> base()&&; constexpr decltype(auto) operator*()const{return get<N>(*current_);} constexpr iterator& operator++();constexprvoid operator++(int) requires (!forward_range<Base>);constexpr iterator operator++(int) requires forward_range<Base>; constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>; constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>; constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>{return get<N>(*(current_ + n));} friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<Base>>; friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& y, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>; friendconstexpr iterator operator+(const iterator& x, difference_type y) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type x, const iterator& y) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& x, difference_type y) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires random_access_range<Base>;};}
[editar]Plantilla de clase std::ranges::elements_view::sentinel
namespace std::ranges{template<input_range V, size_t N> requires view<V>&& __HasTupleElement<range_value_t<V>, N>&& __HasTupleElement<remove_reference_t<range_reference_t<V>>, N>template<bool Const>class elements_view<V, N>::sentinel{// solo exposiciónprivate:using Base = conditional_t<Const, const V, V>;// solo exposición sentinel_t<Base> end_ = sentinel_t<Base>();// solo exposiciónpublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end);constexpr sentinel(sentinel<!Const> other) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>; constexpr sentinel_t<Base> base()const; friendconstexprbool operator==(const iterator<Const>& x, const sentinel& y); friendconstexpr range_difference_t<Base> operator-(const iterator<Const>& x, const sentinel& y) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>; friendconstexpr range_difference_t<Base> operator-(const sentinel& x, const iterator<Const>& y) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;};}
[editar]Plantilla de clase std::ranges::zip_view
namespace std::ranges{template<class... Rs> concept __ZipIsCommon =// solo exposición(sizeof...(Rs)==1&&(common_range<Rs>&& ...))||(!(bidirectional_range<Rs>&& ...)&&(common_range<Rs>&& ...))||((random_access_range<Rs>&& ...)&&(sized_range<Rs>&& ...)); template<class... Ts>using TupleOrPair =/* véase a continuación */;// solo exposición template<class F, class Tuple>constexprauto __TupleTransform(F&& f, Tuple&& tuple){// solo exposiciónreturn apply([&]<class... Ts>(Ts&&... elements){return TupleOrPair<invoke_result_t<F&, Ts>...>( invoke(f, std::forward<Ts>(elements))... );}, std::forward<Tuple>(tuple));} template<class F, class Tuple>constexprvoid TupleForEach(F&& f, Tuple&& tuple){// solo exposición apply([&]<class... Ts>(Ts&&... elements){(invoke(f, std::forward<Ts>(elements)), ...);}, std::forward<Tuple>(tuple));} template<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)class zip_view :public view_interface<zip_view<Views...>>{ tuple<Views...> views_;// solo exposición // plantilla de clase zip_view::iteratortemplate<bool>class iterator;// solo exposición // plantilla de clase zip_view::sentineltemplate<bool>class sentinel;// solo exposición public: zip_view()=default;constexprexplicit zip_view(Views... views); constexprauto begin() requires (!(__SimpleView<Views>&& ...)){return iterator<false>(__TupleTransform(ranges::begin, views_));}constexprauto begin()const requires (range<const Views>&& ...){return iterator<true>(__TupleTransform(ranges::begin, views_));} constexprauto end() requires (!(__SimpleView<Views>&& ...)){ifconstexpr(!__ZipIsCommon<Views...>){return sentinel<false>(__TupleTransform(ranges::end, views_));}elseifconstexpr((random_access_range<Views>&& ...)){return begin()+ iter_difference_t<iterator<false>>(size());}else{return iterator<false>(__TupleTransform(ranges::end, views_));}} constexprauto end()const requires (range<const Views>&& ...){ifconstexpr(!__ZipIsCommon<const Views...>){return sentinel<true>(__TupleTransform(ranges::end, views_));}elseifconstexpr((random_access_range<const Views>&& ...)){return begin()+ iter_difference_t<iterator<true>>(size());}else{return iterator<true>(__TupleTransform(ranges::end, views_));}} constexprauto size() requires (sized_range<Views>&& ...);constexprauto size()const requires (sized_range<const Views>&& ...);}; template<class... Rs> zip_view(Rs&&...)-> zip_view<views::all_t<Rs>...>;}
[editar]Plantilla de clase std::ranges::zip_view::iterator
namespace std::ranges{template<bool Const, class... Views> concept __AllRandomAccess =// solo exposición(random_access_range<__MaybeConst<Const, Views>>&& ...);template<bool Const, class... Views> concept __AllBidirectional =// solo exposición(bidirectional_range<__MaybeConst<Const, Views>>&& ...);template<bool Const, class... Views> concept __AllForward =// solo exposición(forward_range<__MaybeConst<Const, Views>>&& ...); template<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)template<bool Const>class zip_view<Views...>::iterator{ TupleOrPair<iterator_t<__MaybeConst<Const, Views>>...> current_;// solo exposiciónconstexprexplicit iterator(TupleOrPair<iterator_t<__MaybeConst<Const, Views>>...>);// solo exposiciónpublic:using iterator_category = input_iterator_tag;// no siempre está presenteusing iterator_concept =/* véase a continuación */;using value_type = TupleOrPair<range_value_t<__MaybeConst<Const, Views>>...>;using difference_type = common_type_t<range_difference_t<__MaybeConst<Const, Views>>...>; iterator()=default;constexpr iterator(iterator<!Const> i) requires Const &&(convertible_to<iterator_t<Views>, iterator_t<__MaybeConst<Const, Views>>>&& ...); constexprauto operator*()const;constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires __AllForward<Const, Views...>; constexpr iterator& operator--() requires __AllBidirectional<Const, Views...>;constexpr iterator operator--(int) requires __AllBidirectional<Const, Views...>; constexpr iterator& operator+=(difference_type x) requires __AllRandomAccess<Const, Views...>;constexpr iterator& operator-=(difference_type x) requires __AllRandomAccess<Const, Views...>; constexprauto operator[](difference_type n)const requires __AllRandomAccess<Const, Views...>; friendconstexprbool operator==(const iterator& x, const iterator& y) requires (equality_comparable<iterator_t<__MaybeConst<Const, Views>>>&& ...); friendconstexprbool operator<(const iterator& x, const iterator& y) requires __AllRandomAccess<Const, Views...>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires __AllRandomAccess<Const, Views...>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires __AllRandomAccess<Const, Views...>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires __AllRandomAccess<Const, Views...>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires __AllRandomAccess<Const, Views...>&&(three_way_comparable<iterator_t<__MaybeConst<Const, Views>>>&& ...); friendconstexpr iterator operator+(const iterator& i, difference_type n) requires __AllRandomAccess<Const, Views...>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires __AllRandomAccess<Const, Views...>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires __AllRandomAccess<Const, Views...>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires (sized_sentinel_for<iterator_t<__MaybeConst<Const, Views>>, iterator_t<__MaybeConst<Const, Views>>>&& ...); friendconstexprauto iter_move(const iterator& i)noexcept(/* véase a continuación */); friendconstexprvoid iter_swap(const iterator& l, const iterator& r)noexcept(/* véase a continuación */) requires (indirectly_swappable<iterator_t<__MaybeConst<Const, Views>>>&& ...);};}
[editar]Plantilla de clase std::ranges::zip_view::sentinel
namespace std::ranges{template<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)template<bool Const>class zip_view<Views...>::sentinel{ TupleOrPair<sentinel_t<__MaybeConst<Const, Views>>...> end_;// solo exposiciónconstexprexplicit sentinel(TupleOrPair<sentinel_t<__MaybeConst<Const, Views>>...> end);// solo exposiciónpublic: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const &&(convertible_to<sentinel_t<Views>, sentinel_t<__MaybeConst<Const, Views>>>&& ...); template<bool OtherConst> requires (sentinel_for<sentinel_t<__MaybeConst<Const, Views>>, iterator_t<__MaybeConst<OtherConst, Views>>>&& ...)friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires (sized_sentinel_for<sentinel_t<__MaybeConst<Const, Views>>, iterator_t<__MaybeConst<OtherConst, Views>>>&& ...)friendconstexpr common_type_t<range_difference_t<__MaybeConst<OtherConst, Views>>...> operator-(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires (sized_sentinel_for<sentinel_t<__MaybeConst<Const, Views>>, iterator_t<__MaybeConst<OtherConst, Views>>>&& ...)friendconstexpr common_type_t<range_difference_t<__MaybeConst<OtherConst, Views>>...> operator-(const sentinel& y, const iterator<OtherConst>& x);};}
[editar]Plantilla de clase std::ranges::zip_transform_view
namespace std::ranges{template<copy_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __CanReference<invoke_result_t<F&, range_reference_t<Views>...>>class zip_transform_view :public view_interface<zip_transform_view<F, Views...>>{ __CopyableBox<F> fun_;// solo exposición zip_view<Views...> zip_;// solo exposición using InnerView = zip_view<Views...>;// solo exposicióntemplate<bool Const>using ziperator = iterator_t<__MaybeConst<Const, InnerView>>;// solo exposicióntemplate<bool Const>using zentinel = sentinel_t<__MaybeConst<Const, InnerView>>;// solo exposición // plantilla de clase zip_transform_view::iteratortemplate<bool>class iterator;// solo exposición // plantilla de clase zip_transform_view::sentineltemplate<bool>class sentinel;// solo exposición public: zip_transform_view()=default; constexprexplicit zip_transform_view(F fun, Views... views); constexprauto begin(){return iterator<false>(*this, zip_.begin());} constexprauto begin()const requires range<const InnerView>&& regular_invocable<const F&, range_reference_t<const Views>...>{return iterator<true>(*this, zip_.begin());} constexprauto end(){ifconstexpr(common_range<InnerView>){return iterator<false>(*this, zip_.end());}else{return sentinel<false>(zip_.end());}} constexprauto end()const requires range<const InnerView>&& regular_invocable<const F&, range_reference_t<const Views>...>{ifconstexpr(common_range<const InnerView>){return iterator<true>(*this, zip_.end());}else{return sentinel<true>(zip_.end());}} constexprauto size() requires sized_range<InnerView>{return zip_.size();} constexprauto size()const requires sized_range<const InnerView>{return zip_.size();}}; template<class F, class... Rs> zip_transform_view(F, Rs&&...)-> zip_transform_view<F, views::all_t<Rs>...>;}
[editar]Plantilla de clase std::ranges::zip_transform_view::iterator
namespace std::ranges{template<copy_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __CanReference<invoke_result_t<F&, range_reference_t<Views>...>>template<bool Const>class zip_transform_view<F, Views...>::iterator{using Parent = __MaybeConst<Const, zip_transform_view>;// solo exposiciónusing Base = __MaybeConst<Const, InnerView>;// solo exposición Parent* parent_ = nullptr;// solo exposición ziperator<Const> inner_;// solo exposición constexpr iterator(Parent& parent, ziperator<Const> inner);// solo exposición public:using iterator_category =/* véase a continuación */;// no siempre está presenteusing iterator_concept =typename ziperator<Const>::iterator_concept;using value_type = remove_cvref_t<invoke_result_t<__MaybeConst<Const, F>&, range_reference_t<__MaybeConst<Const, Views>>...>>;using difference_type = range_difference_t<Base>; iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<ziperator<false>, ziperator<Const>>; constexpr decltype(auto) operator*()constnoexcept(/* véase a continuación */);constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>; constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>; constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>; constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>; friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<ziperator<Const>>; friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<ziperator<Const>>; friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<ziperator<Const>, ziperator<Const>>;};}
[editar]Plantilla de clase std::ranges::zip_transform_view::sentinel
namespace std::ranges{template<copy_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __CanReference<invoke_result_t<F&, range_reference_t<Views>...>>template<bool Const>class zip_transform_view<F, Views...>::sentinel{ zentinel<Const> inner_;// solo exposiciónconstexprexplicit sentinel(zentinel<Const> inner);// solo exposición public: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<zentinel<false>, zentinel<Const>>; template<bool OtherConst> requires sentinel_for<zentinel<Const>, ziperator<OtherConst>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires sized_sentinel_for<zentinel<Const>, ziperator<OtherConst>>friendconstexpr range_difference_t<__MaybeConst<OtherConst, InnerView>> operator-(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires sized_sentinel_for<zentinel<Const>, ziperator<OtherConst>>friendconstexpr range_difference_t<__MaybeConst<OtherConst, InnerView>> operator-(const sentinel& x, const iterator<OtherConst>& y);};}
[editar]Plantilla de clase std::ranges::adjacent_view
namespace std::ranges{template<forward_range V, size_t N> requires view<V>&&(N >0)class adjacent_view :public view_interface<adjacent_view<V, N>>{ V base_ = V();// solo exposición // plantilla de clase adjacent_view::iteratortemplate<bool>class iterator;// solo exposición // plantilla de clase adjacent_view::sentineltemplate<bool>class sentinel;// solo exposición struct AsSentinel{};// solo exposición public: adjacent_view() requires default_initializable<V>=default;constexprexplicit adjacent_view(V base); constexprauto begin() requires (!__SimpleView<V>){return iterator<false>(ranges::begin(base_), ranges::end(base_));} constexprauto begin()const requires range<const V>{return iterator<true>(ranges::begin(base_), ranges::end(base_));} constexprauto end() requires (!__SimpleView<V>){ifconstexpr(common_range<V>){return iterator<false>(AsSentinel{}, ranges::begin(base_), ranges::end(base_));}else{return sentinel<false>(ranges::end(base_));}} constexprauto end()const requires range<const V>{ifconstexpr(common_range<const V>){return iterator<true>(AsSentinel{}, ranges::begin(base_), ranges::end(base_));}else{return sentinel<true>(ranges::end(base_));}} constexprauto size() requires sized_range<V>;constexprauto size()const requires sized_range<const V>;};}
[editar]Plantilla de clase std::ranges::adjacent_view::iterator
namespace std::ranges{template<forward_range V, size_t N> requires view<V>&&(N >0)template<bool Const>class adjacent_view<V, N>::iterator{using Base = __MaybeConst<Const, V>;// solo exposición array<iterator_t<Base>, N> current_ = array<iterator_t<Base>, N>();// solo exposiciónconstexpr iterator(iterator_t<Base> first, sentinel_t<Base> last);// solo exposiciónconstexpr iterator(AsSentinel, iterator_t<Base> first, iterator_t<Base> last);// solo exposiciónpublic:using iterator_category = input_iterator_tag;using iterator_concept =/* véase a continuación */;// sea REPEAT(T, N) como un paquete de N tipos, donde cada uno denota el mismo tipo que Tusing value_type = TupleOrPair</* REPEAT(range_value_t<Base>, N) */...>;using difference_type = range_difference_t<Base>; iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>; constexprauto operator*()const;constexpr iterator& operator++();constexpr iterator operator++(int); constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>; constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>; constexprauto operator[](difference_type n)const requires random_access_range<Base>; friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>; friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>; friendconstexprauto iter_move(const iterator& i)noexcept(/* véase a continuación */);friendconstexprvoid iter_swap(const iterator& l, const iterator& r)noexcept(/* véase a continuación */) requires indirectly_swappable<iterator_t<Base>>;};}
[editar]Plantilla de clase std::ranges::adjacent_view::sentinel
namespace std::ranges{template<forward_range V, size_t N> requires view<V>&&(N >0)template<bool Const>class adjacent_view<V, N>::sentinel{using Base = __MaybeConst<Const, V>;// solo exposición sentinel_t<Base> end_ = sentinel_t<Base>();// solo exposiciónconstexprexplicit sentinel(sentinel_t<Base> end);// solo exposición public: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>; template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__MaybeConst<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__MaybeConst<OtherConst, V>>>friendconstexpr range_difference_t<__MaybeConst<OtherConst, V>> operator-(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__MaybeConst<OtherConst, V>>>friendconstexpr range_difference_t<__MaybeConst<OtherConst, V>> operator-(const sentinel& y, const iterator<OtherConst>& x);};}
[editar]Plantilla de clase std::ranges::adjacent_transform_view
namespace std::ranges{template<forward_range V, copy_constructible F, size_t N> requires view<V>&&(N >0)&& is_object_v<F>&& regular_invocable<F&, /* REPEAT(range_reference_t<V>, N) */...>&& __CanReference<invoke_result_t<F&, /* REPEAT(range_reference_t<V>, N) */...>>class adjacent_transform_view :public view_interface<adjacent_transform_view<V, F, N>>{ __CopyableBox<F> fun_;// solo exposición adjacent_view<V, N> inner_;// solo exposición using InnerView = adjacent_view<V, N>;// solo exposicióntemplate<bool Const>using InnerIterator = iterator_t<__MaybeConst<Const, InnerView>>;// solo exposicióntemplate<bool Const>using InnerSentinel = sentinel_t<__MaybeConst<Const, InnerView>>;// solo exposición // plantilla de clase adjacent_transform_view::iteratortemplate<bool>class iterator;// solo exposición // plantilla de clase adjacent_transform_view::sentineltemplate<bool>class sentinel;// solo exposición public: adjacent_transform_view()=default;constexprexplicit adjacent_transform_view(V base, F fun); constexprauto begin(){return iterator<false>(*this, inner_.begin());} constexprauto begin()const requires range<const InnerView>&& regular_invocable<const F&, /* REPEAT(range_reference_t<const V>, N) */...>{return iterator<true>(*this, inner_.begin());} constexprauto end(){ifconstexpr(common_range<InnerView>){return iterator<false>(*this, inner_.end());}else{return sentinel<false>(inner_.end());}} constexprauto end()const requires range<const InnerView>&& regular_invocable<const F&, /* REPEAT(range_reference_t<const V>, N) */...>{ifconstexpr(common_range<const InnerView>){return iterator<true>(*this, inner_.end());}else{return sentinel<true>(inner_.end());}} constexprauto size() requires sized_range<InnerView>{return inner_.size();} constexprauto size()const requires sized_range<const InnerView>{return inner_.size();}};}
[editar]Plantilla de clase std::ranges::adjacent_transform_view::iterator
namespace std::ranges{template<forward_range V, copy_constructible F, size_t N> requires view<V>&&(N >0)&& is_object_v<F>&& regular_invocable<F&, /* REPEAT(range_reference_t<V>, N) */...>&& __CanReference<invoke_result_t<F&, /* REPEAT(range_reference_t<V>, N) */...>>template<bool Const>class adjacent_transform_view<F, V...>::iterator{using Parent = __MaybeConst<Const, adjacent_transform_view>;// solo exposiciónusing Base = __MaybeConst<Const, V>;// solo exposición Parent* parent_ = nullptr;// solo exposición InnerIterator<Const> inner_;// solo exposición constexpr iterator(Parent& parent, InnerIterator<Const> inner);// solo exposición public:using iterator_category =/* véase a continuación */;using iterator_concept =typename InnerIterator<Const>::iterator_concept;using value_type = remove_cvref_t<invoke_result_t<__MaybeConst<Const, F>&, /* REPEAT(range_reference_t<Base>, N) */...>>;using difference_type = range_difference_t<Base>; iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<InnerIterator<false>, InnerIterator<Const>>; constexpr decltype(auto) operator*()constnoexcept(/* véase a continuación */);constexpr iterator& operator++();constexpr iterator operator++(int);constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>; constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>; friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<InnerIterator<Const>>; friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<InnerIterator<Const>, InnerIterator<Const>>;};}
[editar]Plantilla de clase std::ranges::adjacent_transform_view::sentinel
namespace std::ranges{template<forward_range V, copy_constructible F, size_t N> requires view<V>&&(N >0)&& is_object_v<F>&& regular_invocable<F&, REPEAT(range_reference_t<V>, N)...>&& __CanReference<invoke_result_t<F&, /* REPEAT(range_reference_t<V>, N) */...>>template<bool Const>class adjacent_transform_view<V, F, N>::sentinel{ InnerSentinel<Const> inner_;// solo exposiciónconstexprexplicit sentinel(InnerSentinel<Const> inner);// solo exposición public: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<InnerSentinel<false>, InnerSentinel<Const>>; template<bool OtherConst> requires sentinel_for<InnerSentinel<Const>, InnerSentinel<OtherConst>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires sized_sentinel_for<InnerSentinel<Const>, InnerSentinel<OtherConst>>friendconstexpr range_difference_t<__MaybeConst<OtherConst, InnerView>> operator-(const iterator<OtherConst>& x, const sentinel& y); template<bool OtherConst> requires sized_sentinel_for<InnerSentinel<Const>, InnerSentinel<OtherConst>>friendconstexpr range_difference_t<__MaybeConst<OtherConst, InnerView>> operator-(const sentinel& x, const iterator<OtherConst>& y);};}