Namespaces
Variants

std::experimental::ranges:: adjacent_find

From cppreference.net
Definido en el encabezado <experimental/ranges/algorithm>
template < ForwardIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectRelation < projected < I, Proj >> Pred = ranges:: equal_to <> >

I adjacent_find ( I first, S last, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class Proj = ranges:: identity ,

IndirectRelation < projected < ranges:: iterator_t < R > , Proj >> Pred = ranges:: equal_to <> >

ranges:: safe_iterator_t < R > adjacent_find ( R && r, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) Busca en el rango [ first , last ) dos elementos consecutivos idénticos. Los elementos se comparan usando pred después de ser proyectados con proj .
2) Igual que (1) , pero utiliza r como el rango fuente, como si se usara ranges:: begin ( r ) como first y ranges:: end ( r ) como last .

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 llamar a un algoritmo, el programa probablemente no sea portable.

Contenidos

Parámetros

first, last - el rango de elementos a examinar
r - el rango de elementos a examinar
pred - predicado para usar al comparar los elementos proyectados
proj - proyección a aplicar a los elementos

Valor de retorno

Un iterador al primero del primer par de elementos idénticos, es decir, el primer iterador i tal que tanto i como i + 1 están en el rango [ first , last ) y ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) , ranges:: invoke ( proj, * ( i + 1 ) ) ) ! = false .

Si no se encuentran tales elementos, se devuelve un iterador que es igual a last .

Complejidad

Si el rango no está vacío, exactamente min((result - first) + 1, (last - first) - 1) aplicaciones del predicado donde result es el valor de retorno, y como máximo el doble de aplicaciones de la proyección.

Implementación posible

template<ForwardIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectRelation<projected<I, Proj>> Pred = ranges::equal_to<>>
I adjacent_find(I first, S last, Pred pred = Pred{}, Proj proj = Proj{})
{
    if (first == last)
        return first;
    I next = first;
    ++next;
    while (next != last)
    {
        if (ranges::invoke(pred, ranges::invoke(proj, *first),
                                 ranges::invoke(proj, *next)))
            return first;
        ++next;
        ++first;
    }
    return next;
}

Ejemplo

Véase también

encuentra los dos primeros elementos adyacentes que son iguales (o satisfacen un predicado dado)
(function template)
elimina elementos duplicados consecutivos en un rango
(function template)