find_if() ist eine sehr interessante Verallgemeinerung von find(). Allerdings ist er, wie viele interessante Dinge, etwas anspruchsvoll. Um sich seiner bedienen zu können, müssen Sie etwas von sogenannten Prädikaten verstehen. Wenn Sie meine Ausführungen zu Funktionsobjekten im Zusammenhang mit for_each() verstanden haben und handhaben können, werden Sie schnell erfassen, was ein Prädikat ist.
Der Prototyp von find_if() lautet:
template <typename Eingabeiterator, typename Praedikat>
|
Ein Prädikat ist ein Funktionsobjekt, dessen Aufrufoperator () einen Wahrheitswert (false, true) liefert.
Dieser Algorithmus sucht im Bereich [ Anfang, Ende ) nach dem ersten Element, zu welchem das Prädikat f den Wert true liefert.
Wenn ein solches Element gefunden wird, liefert find_if() einen Eingabeiterator (const Iterator) zurück, der auf das gefundene Element zeigt. Andernfalls liefert find_if() den Endeiterator, was also soviel bedeutet wie "kein entsprechendes Element gefunden".
In einem Vektor soll nach einer Zahl gesucht werden, die zwischen zwei bestimmten Werten liegt (Intervall). Statt eines Vektors kann selbstverständlich auch ein anderer Container verwendet werden.
Dazu können wir Teile des for_each()-Beispiels verwenden:
1. Beschreibungsdateien
|
iostream für cout vector für den Vektorcontainer algorithm für find_if() functional für das zu erstellende Prädikat |
2. main-Funktion mit dem Aufruf von find_if()
|
Hier wird übrigens mit dem von find_if() gelieferten Nur-Lese-Iterator eine automatische
Typkonvertierung (casting) durchgeführt, weil iter ein Iterator ist, über den ein
Element auch verändert werden kann. Sie könnten also beispielsweise mit Hilfe von iter
das entsprechende Element löschen lassen. |