std::ranges::filter_view<V,Pred>::iterator
class /*iterator*/; |
(desde C++20) | |
El tipo de retorno de filter_view::begin. El nombre iterator es solo para efectos de exposición.
Es un bidirectional_iterator si V modela bidirectional_range, un forward_iterator si V modela forward_range, y input_iterator de lo contrario.
Se permite la modificación del elemento indicado por este iterador, pero da como resultado un comportamiento no definido si el valor resultante no satisface el predicado del filtro.
Tipos miembro
| Tipo miembro | Definición |
iterator_concept
|
|
iterator_category
|
Definido si y solo si
|
value_type
|
ranges::range_value_t<V>
|
difference_type
|
ranges::range_difference_t<V>
|
Datos miembro
Las implementaciones típicas de iterator mantienen dos datos miembro no estáticos:
- un iterador de tipo
ranges::iterator_t<V>en la vista (view) subyacente (que se muestra aquí comocurrent_solo de exposición), y - un puntero de tipo
ranges::filter_view<V, Pred>*al objetofilter_viewpadre (que se muestra aquí comoparent_solo de exposición).
Funciones miembro
(constructor) (C++20) |
Construye un iterador. (función miembro pública) |
base (C++20) |
Devuelve el iterador subyacente. (función miembro pública) |
operator*operator-> (C++20) |
Reenvía al iterador subyacente. (función miembro pública) |
operator++operator++(int)operator--operator--(int) (C++20) |
Avanza o decrementa el iterador. (función miembro pública) |
std::ranges::filter_view::iterator::iterator
<tbody> </tbody> /*iterator*/() requires std::default_initializable<ranges::iterator_t<V>> = default; |
(1) | (desde C++20) |
constexpr /*iterator*/( filter_view& parent, ranges::iterator_t<V> current ); |
(2) | (desde C++20) |
current_ y parent_ con sus inicializadores de miembro por defecto, que son = ranges::iterator_t<V>() y = nullptr, respectivamente.current_ con std::move(current) y parent_ con std::addressof(parent).
std::ranges::filter_view::iterator::base
<tbody> </tbody> constexpr const ranges::iterator_t<V>& base() const & noexcept; |
(1) | (desde C++20) |
constexpr ranges::iterator_t<V> base() &&; |
(2) | (desde C++20) |
return current_;.return std::move(current_);.
std::ranges::filter_view::iterator::operator*,->
<tbody> </tbody> constexpr ranges::range_reference_t<V> operator*() const; |
(1) | (desde C++20) |
constexpr ranges::iterator_t<V> operator->() const requires /*tiene-flecha*/<ranges::iterator_t<V>> && std::copyable<ranges::iterator_t<V>>; |
(2) | (desde C++20) |
return *current_;.return current_;.Para un tipo
I, /*tiene-flecha*/<I> se modela o se satisface si y solo si I modela o satisface input_iterator, respectivamente, y ya sea que I es un tipo puntero o requires(I i){ i.operator->(); } es true.
std::ranges::filter_view::iterator::operator++
<tbody> </tbody> constexpr /*iterator*/& operator++(); |
(1) | (desde C++20) |
constexpr void operator++( int ); |
(2) | (desde C++20) |
constexpr /*iterator*/ operator++( int ) requires ranges::forward_range<V>; |
(3) | (desde C++20) |
current_ = ranges::find_if(std::move(++current_), ranges::end(parent_->base_), std::ref(*parent_->pred_)); return *this;.
++*this;.auto tmp = *this; ++*this; return tmp;.
std::ranges::filter_view::iterator::operator--
<tbody> </tbody> constexpr /*iterator*/& operator--() requires ranges::bidirectional_range<V>; |
(1) | (desde C++20) |
constexpr /*iterator*/ operator--( int ) requires ranges::bidirectional_range<V>; |
(2) | (desde C++20) |
do --current_; while (!std::invoke(*parent_->pred_, *current_)); return *this;.
auto tmp = *this; --*this; return tmp;.
Funciones no miembro
operator== (C++20) |
Compara los iteradores subyacentes. (función) |
iter_move (C++20) |
Convierte el resultado de desreferenciar el iterador subyacente a su tipo referencia r-valor asociado. (función) |
iter_swap (C++20) |
Intercambia los objetos a los que apuntan los dos iteradores subyacentes. (función) |
operator==(std::ranges::filter_view::iterator)
<tbody> </tbody> friend constexpr bool operator==( const /*iterator*/& x, const /*iterator*/& y ) requires std::equality_comparable<ranges::iterator_t<V>>; |
(desde C++20) | |
Equivalente a return x.current_ == y.current_;.
El operador != se sintetiza a partir de operator==.
Esta función no es visible a una búsqueda no calificada o calificada, y puede encontrarse solamente mediante la búsqueda dependiente de argumento cuando std::ranges::filter_view::iterator es una clase asociada de los argumentos.
iter_move(std::ranges::filter_view::iterator)
<tbody> </tbody> friend constexpr ranges::range_rvalue_reference_t<V> iter_move( const /*iterator*/& i ) noexcept(noexcept(ranges::iter_move(i.current_))); |
(desde C++20) | |
Equivalente a return ranges::iter_move(i.current_);.
Esta función no es visible a una búsqueda no calificada o calificada, y puede encontrarse solamente mediante la búsqueda dependiente de argumento cuando std::ranges::filter_view::iterator es una clase asociada de los argumentos.
iter_swap(std::ranges::filter_view::iterator)
<tbody> </tbody> friend constexpr void iter_swap( const /*iterator*/& x, const /*iterator*/& y ) noexcept(noexcept(ranges::iter_swap(x.current_, y.current_))) requires std::indirectly_swappable<ranges::iterator_t<V>>; |
(desde C++20) | |
Equivalente a ranges::iter_swap(x.current_, y.current_).
Esta función no es visible a una búsqueda no calificada o calificada, y puede encontrarse solamente mediante la búsqueda dependiente de argumento cuando std::ranges::filter_view::iterator es una clase asociada de los argumentos.
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P2259R1 | C++20 | El tipo miembro iterator_category siempre estaba definido.
|
Definido solo si V es un forward_range.
|
| LWG 3533 | C++20 | La sobrecarga const& de base copiaba el iterador subyacente.
|
Devuelve una referencia a él. |
| LWG 3593 | C++20 | La sobrecarga const& de base podría no ser noexcept.
|
Se hizo noexcept.
|