Espacios de nombres
Variantes
Acciones

std::ranges::find_first_of

De cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Algoritmos restringidos
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones en almacenamiento sin inicializar
Operaciones de partición
Operaciones de ordenamiento
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo/montón
Operaciones de mínimo/máximo
Permutaciones
 
Definido en el archivo de encabezado <algorithm>
Signatura de la llamada
template<std::input_iterator I1, std::sentinel_for<I1> S1,

          std::forward_iterator I2, std::sentinel_for<I2> S2,
          class Pred =ranges::equal_to,
          class Proj1 =std::identity,
          class Proj2 =std::identity>
requires  std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr I1 find_first_of( I1 first1, S1 last1, I2 first2, S2 last2,

                            Pred pred ={}, Proj1 proj1 ={}, Proj2 proj2 ={});
(1) (desde C++20)
template<ranges::input_range R1, ranges::forward_range R2,

          class Pred =ranges::equal_to,
          class Proj1 =std::identity,
          class Proj2 =std::identity>
requires  std::indirectly_comparable<ranges::iterator_t<R1>,
                                     ranges::iterator_t<R2>,
                                     Pred, Proj1, Proj2>
constexprranges::borrowed_iterator_t<R1>
  find_first_of( R1&& r1, R2&& r2, Pred pred ={},

                 Proj1 proj1 ={}, Proj2 proj2 ={});
(2) (desde C++20)
1) Busca en el rango [first1, last1) por cualquiera de los elementos en el rango [first2, last2), después de proyectar los rangos con proj1 y proj2, respectivamente. Los elementos proyectados se comparan usando el predicado binario pred.
2) Igual que (1), pero usa r1 como el primer rango fuente y r2 como el segundo rango fuente, como si usara ranges::begin(r1) como first1, ranges::end(r1) como last1, ranges::begin(r2) como first2, y ranges::end(r2) como last2.

Las entidades similares a funciones descritas en esta página son niebloids, es decir:

En la práctica, pueden implementarse como objetos función o con extensiones de compilador especiales.

Contenido

[editar]Parámetros

first1, last1 - El rango de los elementos a examinar (p. ej., pajar).
first2, last2 - El rango de los elementos a buscar (p. ej., agujas).
r1 - El rango de los elementos a examinar (p. ej., pajar).
r2 - El rango de los elementos a buscar (p. ej., agujas).
pred - Predicado binario para comparar los elementos.
proj1 - Proyección a aplicar a los elementos en el primer rango.
proj2 - Proyección a aplicar a los elementos en el segundo rango.

[editar]Valor de retorno

Iterador al primer elemento en el rango [first1, last1) que es igual a un elemento del rango [first2, last2) después de la proyección. Si no se encuentra dicho elemento, se devuelve un iterador que se compara igual a last1.

[editar]Complejidad

A lo sumo (S*N) aplicaciones del predicado y cada proyección, donde
(1)S =ranges::distance(first2, last2) y N =ranges::distance(first1, last1);
(2)S =ranges::distance(r2) y N =ranges::distance(r1).

[editar]Posible implementación

struct find_first_of_fn {   template<std::input_iterator I1, std::sentinel_for<I1> S1, std::forward_iterator I2, std::sentinel_for<I2> S2, class Pred =ranges::equal_to, class Proj1 =std::identity, class Proj2 =std::identity> requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>constexpr I1 operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred ={}, Proj1 proj1 ={}, Proj2 proj2 ={})const{for(; first1 != last1;++first1)for(auto i = first2; i != last2;++i)if(std::invoke(pred, std::invoke(proj1, *first1), std::invoke(proj2, *i)))return first1;return first1;}   template<ranges::input_range R1, ranges::forward_range R2, class Pred =ranges::equal_to, class Proj1 =std::identity, class Proj2 =std::identity> requires std::indirectly_comparable<ranges::iterator_t<R1>, ranges::iterator_t<R2>, Pred, Proj1, Proj2>constexprranges::borrowed_iterator_t<R1> operator()(R1&& r1, R2&& r2, Pred pred ={}, Proj1 proj1 ={}, Proj2 proj2 ={})const{return(*this)(ranges::begin(r1), ranges::end(r1), ranges::begin(r2), ranges::end(r2), std::move(pred), std::move(proj1), std::move(proj2));}};   inlineconstexpr find_first_of_fn find_first_of{};

[editar]Ejemplo

#include <algorithm>#include <iostream>#include <iterator>   int main(){namespace rng = std::ranges;   constexprstaticauto pajar ={1, 2, 3, 4};constexprstaticauto agujas ={0, 3, 4, 3};   constexprauto encontrado1 = rng::find_first_of(pajar.begin(), pajar.end(), agujas.begin(), agujas.end()); static_assert(std::distance(pajar.begin(), encontrado1)==2);   constexprauto encontrado2 = rng::find_first_of(pajar, agujas); static_assert(std::distance(pajar.begin(), encontrado2)==2);     constexprstaticauto negativos ={-6, -3, -4, -3};constexprauto no_encontrado = rng::find_first_of(pajar, negativos); static_assert(no_encontrado == pajar.end());   constexprauto encontrado3 = rng::find_first_of(pajar, negativos, [](int x, int y){return x ==-y;});// usa un comparador binario static_assert(std::distance(pajar.begin(), encontrado3)==2);     struct P {int x, y;};constexprstaticauto p1 ={ P{1, -1}, P{2, -2}, P{3, -3}, P{4, -4}};constexprstaticauto p2 ={ P{5, -5}, P{6, -3}, P{7, -5}, P{8, -3}};   // Comparar solo los datos miembro de P::y data proyectándolos:constauto encontrado4 = rng::find_first_of(p1, p2, {}, &P::y, &P::y);std::cout<<"Primer elemento equivalente {"<< encontrado4->x <<", "<< encontrado4->y <<"} se encontró en la posición "<<std::distance(p1.begin(), encontrado4)<<".\n";}

Salida:

Primer elemento equivalente {3, -3} se encontró en la posición 2.

[editar]Véase también

Busca por cualquiera de un conjunto de elementos.
(plantilla de función)[editar]
Encuentra dos primeros elementos contiguos idénticos (o que satisfagan un predicado dado).
(niebloid)[editar]
Encuentra el primer elemento que satisfaga un criterio específico.
(niebloid)[editar]
Encuentra la última secuencia de elementos en un cierto rango.
(niebloid)[editar]
Busca una subsecuencia de elementos en un rango.
(niebloid)[editar]
Busca un número de copias consecutivas de un elemento en un rango.
(niebloid)[editar]
close