std::ranges:: views:: filter, std::ranges:: filter_view
|
Definido en el encabezado
<ranges>
|
||
|
template
<
ranges::
input_range
V,
std::
indirect_unary_predicate
<
ranges::
iterator_t
<
V
>>
Pred
>
|
(1) | (desde C++20) |
|
namespace
views
{
inline
constexpr
/* no especificado */
filter
=
/* no especificado */
;
|
(2) | (desde C++20) |
|
Firma de llamada
|
||
|
template
<
ranges::
viewable_range
R,
class
Pred
>
requires
/* ver más abajo */
|
(desde C++20) | |
|
template
<
class
Pred
>
constexpr /* adaptador de rango de cierre */ filter ( Pred && pred ) ; |
(desde C++20) | |
view
de una secuencia subyacente con solo los elementos que satisfacen el predicado.
filter_view
modela los conceptos
bidirectional_range
,
forward_range
,
input_range
, y
common_range
cuando la
view
subyacente
V
modela los respectivos conceptos.
Contenidos |
Miembros de datos
| Miembro | Descripción |
V
base_
|
la vista subyacente
( objeto miembro solo para exposición* ) |
copyable-box
<Pred>
(until C++23)
movable-box
<Pred>
(since C++23)
pred_
|
encapsula el predicado utilizado para filtrar elementos de
base_
( objeto miembro solo para exposición* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
begin_
(presente solo si
V
satisface
forward_range
)
|
un objeto que almacena en caché un iterador al primer elemento de
base_
que satisface el
pred_
( objeto miembro solo para exposición* ) |
Funciones miembro
construye un
filter_view
(función miembro pública) |
|
devuelve la vista subyacente
V
(función miembro pública) |
|
devuelve una referencia al predicado almacenado en
filter_view
(función miembro pública) |
|
devuelve el iterador inicial del
filter_view
(función miembro pública) |
|
devuelve el centinela del
filter_view
(función miembro pública) |
|
Heredado de std::ranges::view_interface |
|
devuelve si la vista derivada está vacía, proporcionado solo si satisface
sized_range
o
forward_range
(función miembro pública de
std::ranges::view_interface<D>
)
|
|
|
(C++23)
|
devuelve un iterador constante al inicio del rango
(función miembro pública de
std::ranges::view_interface<D>
)
|
|
(C++23)
|
devuelve un centinela para el iterador constante del rango
(función miembro pública de
std::ranges::view_interface<D>
)
|
|
devuelve si la vista derivada no está vacía, proporcionado solo si
ranges::empty
es aplicable a ella
(función miembro pública de
std::ranges::view_interface<D>
)
|
|
devuelve el primer elemento en la vista derivada, proporcionado si satisface
forward_range
(función miembro pública de
std::ranges::view_interface<D>
)
|
|
devuelve el último elemento en la vista derivada, proporcionado solo si satisface
bidirectional_range
y
common_range
(función miembro pública de
std::ranges::view_interface<D>
)
|
|
std::ranges::filter_view:: filter_view
|
filter_view
(
)
requires
std::
default_initializable
<
V
>
&&
std:: default_initializable < Pred > = default ; |
(1) | (desde C++20) |
|
constexpr
explicit
filter_view
(
V base, Pred pred
)
;
|
(2) | (desde C++20) |
base_
mediante su inicializador de miembro por defecto (
=
V
(
)
) e inicializa por defecto
pred_
(lo cual inicializa por valor el
Pred
contenido).
base_
con
std
::
move
(
base
)
e inicializa
pred_
con
std
::
move
(
pred
)
.
Parámetros
| base | - | rango a filtrar |
| pred | - | predicado para filtrar elementos |
std::ranges::filter_view:: base
|
constexpr
V base
(
)
const
&
requires
std::
copy_constructible
<
V
>
;
|
(1) | (desde C++20) |
|
constexpr
V base
(
)
&&
;
|
(2) | (desde C++20) |
std::ranges::filter_view:: pred
|
constexpr
const
Pred
&
pred
(
)
const
;
|
(desde C++20) | |
Devuelve una referencia al objeto
Pred
contenido. El comportamiento es indefinido si
pred_
no contiene un valor.
std::ranges::filter_view:: begin
|
constexpr
/*iterator*/
begin
(
)
;
|
( solo para exposición* ) | |
Para proporcionar la complejidad de tiempo constante amortizada requerida por el concepto
range
, esta función almacena en caché el resultado dentro del objeto
filter_view
para su uso en llamadas posteriores. Equivalente a
if constexpr (!ranges::forward_range<V>) return /*iterator*/{*this, ranges::find_if(base_, std::ref(*pred_))}; else { if (!begin_.has_value()) begin_ = ranges::find_if(base_, std::ref(*pred_)); // caching return /*iterator*/{*this, begin_.value())}; }
El comportamiento es indefinido si
pred_
no contiene un valor.
std::ranges::filter_view:: end
|
constexpr
auto
end
(
)
;
|
(desde C++20) | |
Devuelve un iterador al final. Equivalente a
if constexpr (ranges::common_range<V>) return /*iterator*/{*this, ranges::end(base_)}; else return /*sentinel*/{*this};
Guías de deducción
|
template
<
class
R,
class
Pred
>
filter_view ( R && , Pred ) - > filter_view < views:: all_t < R > , Pred > ; |
(desde C++20) | |
Clases anidadas
el tipo de iterador de
filter_view
( clase miembro solo para exposición* ) |
|
el tipo de centinela de
filter_view
cuando la vista subyacente no es un
common_range
( clase miembro solo para exposición* ) |
Ejemplo
#include <iostream> #include <ranges> int main() { auto even = [](int i) { return 0 == i % 2; }; auto square = [](int i) { return i * i; }; for (int i : std::views::iota(0, 6) | std::views::filter(even) | std::views::transform(square)) std::cout << i << ' '; std::cout << '\n'; }
Salida:
0 4 16
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
|
LWG 3714
( P2711R1 ) |
C++20 | el constructor multiparámetro no era explícito | hecho explícito |
| P2325R3 | C++20 |
si
Pred
no es
default_initializable
, el constructor por defecto
construye un
filter_view
que no contiene un
Pred
|
el
filter_view
tampoco es
default_initializable
|
Véase también
una
view
que consiste en los elementos iniciales de otra
view
, hasta el primer elemento en el cual un predicado devuelve
false
(plantilla de clase) (objeto adaptador de rango) |