Namensräume
Varianten
Aktionen

std::experimental::ranges::adjacent_find

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
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) Sucht im Bereich [firstlast) nach zwei aufeinanderfolgenden identischen Elementen. Elemente werden mittels pred verglichen, nachdem sie mit proj projiziert wurden.
2) Dasselbe wie (1), aber verwendet r als Quellbereich, als ob ranges::begin(r) als first und ranges::end(r) als last verwendet würden.

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

Inhalt

[edit] Parameter

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

[edit] Rückgabewert

Ein Iterator zum ersten der ersten identischen Elementpaare, d. h. der erste Iterator i, für den sowohl i als auch i + 1 im Bereich [firstlast) liegen und ranges::invoke(pred, ranges::invoke(proj, *i), ranges::invoke(proj, *(i + 1))) != false.

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

[edit] Komplexität

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

[edit] 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;
}

[edit] Beispiel

[edit] Siehe auch

Findet die ersten beiden benachbarten Elemente, die gleich sind (oder eine gegebene Bedingung erfüllen)
(Funktionstempelat) [edit]
Entfernt aufeinanderfolgende doppelte Elemente in einem Bereich
(Funktionsvorlage) [bearbeiten]