Namespaces
Variants

std::experimental::ranges:: adjacent_find

From cppreference.net
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) Durchsucht den Bereich [ first , last ) nach zwei aufeinanderfolgenden identischen Elementen. Elemente werden mit pred verglichen, nachdem sie mit proj projiziert wurden.
2) Gleich wie (1) , verwendet jedoch r als Quellbereich, als ob ranges:: begin ( r ) als first und ranges:: end ( r ) als last verwendet würde.

Ungeachtet der oben dargestellten Deklarationen sind die tatsächliche Anzahl und Reihenfolge der Template-Parameter für Algorithmusdeklarationen nicht spezifiziert. Daher ist das Programm wahrscheinlich nicht portabel, wenn explizite Template-Argumente beim Aufruf eines Algorithmus verwendet werden.

Inhaltsverzeichnis

Parameter

first, last - der Bereich der zu untersuchenden Elemente
r - der Bereich der zu untersuchenden Elemente
pred - Prädikat zum Vergleichen der projizierten Elemente
proj - Projektion, die auf die Elemente angewendet wird

Rückgabewert

Ein Iterator zum ersten des ersten Paars identischer Elemente, also der erste Iterator i , sodass sowohl i als auch i + 1 im Bereich [ first , last ) liegen und ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) , ranges:: invoke ( proj, * ( i + 1 ) ) ) ! = false .

Falls keine solchen Elemente gefunden werden, wird ein Iterator zurückgegeben, der gleich last ist.

Komplexität

Wenn der Bereich nicht leer ist, genau min((result - first) + 1, (last - first) - 1) Anwendungen des Prädikats, wobei result der Rückgabewert ist, und höchstens doppelt so viele Anwendungen der Projektion.

Mögliche Implementierung

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;
}

Beispiel

Siehe auch

findet die ersten zwei benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen)
(Funktions-Template)
entfernt aufeinanderfolgende doppelte Elemente in einem Bereich
(Funktions-Template)