std::experimental::ranges::adjacent_find
| Definiert in Header <experimental/ranges/algorithm> |
||
| template< ForwardIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectRelation<projected<I, Proj>> Pred = ranges::equal_to<> > |
(1) | (Ranges TS) |
| template< ForwardRange R, class Proj = ranges::identity, IndirectRelation<projected<ranges::iterator_t<R>, Proj>> Pred = ranges::equal_to<> > |
(2) | (Ranges TS) |
[first, last) nach zwei aufeinanderfolgenden identischen Elementen. Elemente werden mittels pred verglichen, nachdem sie mit proj projiziert wurden.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 [first, last) 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
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[edit] Siehe auch
| Findet die ersten beiden benachbarten Elemente, die gleich sind (oder eine gegebene Bedingung erfüllen) (Funktionstempelat) | |
| Entfernt aufeinanderfolgende doppelte Elemente in einem Bereich (Funktionsvorlage) |