Namespaces
Variants

std::experimental::ranges:: search

From es.cppreference.net
Definido en el encabezado <experimental/ranges/algorithm>
template < ForwardIterator I1, Sentinel < I1 > S1,

ForwardIterator I2, Sentinel < I2 > S2, class Pred = ranges:: equal_to <> ,
class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < I1, I2, Pred, Proj1, Proj2 >
I1 search ( I1 first1, S1 last1, I2 first2, S2 last2,

Pred pred = Pred { } , Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(1) (ranges TS)
template < ForwardRange R1, ForwardRange R2, class Pred = ranges:: equal_to <> ,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R1 > , ranges:: iterator_t < R2 > ,
Pred, Proj1, Proj2 >
ranges:: safe_iterator_t < R1 > search ( R1 && r1, R2 && r2, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(2) (ranges TS)
1) Busca la primera ocurrencia de la secuencia de elementos [ first2 , last2 ) en el rango [ first1 , last1 ) . Los elementos se comparan usando pred después de ser proyectados con proj2 y proj1 , respectivamente.
2) Igual que (1) , pero utiliza r1 como el primer rango fuente y r2 como el segundo rango fuente, como si se usara ranges:: begin ( r1 ) como first1 , ranges:: end ( r1 ) como last1 , ranges:: begin ( r2 ) como first2 , y ranges:: end ( r2 ) como last2 .

No obstante las declaraciones representadas anteriormente, el número real y el orden de los parámetros de plantilla para las declaraciones de algoritmos no está especificado. Por lo tanto, si se utilizan argumentos de plantilla explícitos al invocar un algoritmo, el programa probablemente no sea portable.

Contenido

Parámetros

first1, last1 - el rango de elementos a examinar
r1 - el rango de elementos a examinar
first2, last2 - el rango de elementos a buscar
r2 - el rango de elementos a buscar
pred - predicado para aplicar a los elementos proyectados
proj1 - proyección para aplicar a los elementos en el primer rango
proj2 - proyección para aplicar a los elementos en el segundo rango

Valor de retorno

Un iterador al inicio de la primera ocurrencia de la secuencia [ first2 , last2 ) en el rango [ first1 , last1 ) . Si [ first2 , last2 ) está vacío, se devuelve first1 . Si no se encuentra dicha ocurrencia, se devuelve un iterador que compara igual a last1 .

Complejidad

Como máximo S * N aplicaciones del predicado y cada proyección, donde S = last2 - first2 y N = last1 - first1 .

Implementación posible

template<ForwardIterator I1, Sentinel<I1> S1,
         ForwardIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>,
         class Proj1 = ranges::identity, class Proj2 = ranges::identity>
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
I1 search(I1 first1, S1 last1, I2 first2, S2 last2,
          Pred pred = Pred{}, Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{})
{
    for (; ; ++first1)
    {
        I1 it = first1;
        for (I2 it2 = first2; ; (void)++it, (void)++it2)
        {
            if (it2 == last2)
                return first1;
            if (it == last1)
                return it;
            if (!ranges::invoke(pred, ranges::invoke(proj1, *it),
                                      ranges::invoke(proj2, *it2)))
                break;
        }
    }
}

Ejemplo

Véase también

busca la primera aparición de un rango de elementos
(plantilla de función & objeto función de algoritmo)
encuentra la última secuencia de elementos en un rango determinado
(plantilla de función)
devuelve true si un conjunto es subconjunto de otro
(plantilla de función)
determina si dos conjuntos de elementos son iguales
(plantilla de función)
encuentra el primer elemento que satisface criterios específicos
(plantilla de función)
devuelve true si un rango es lexicográficamente menor que otro
(plantilla de función)
encuentra la primera posición donde dos rangos difieren
(plantilla de función)
busca un número de copias consecutivas de un elemento en un rango
(plantilla de función)