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 mit
pred
verglichen, nachdem sie mit
proj
projiziert wurden.
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
|
Dieser Abschnitt ist unvollständig
Grund: Kein 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) |