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>
Eingabeiterator find_if(Eingabeiterator Anfang, Eingabeiterator Ende, Praedikat f);
(siehe auch sgi-Dokumentation)
Eingabeiterator ist praktisch gleichbedeutend mit einem const Iterator.
find_if() gehört zu den nichtmodifizierenden Algorithmen.

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".

Widmen wir uns nun einem kleinen praktischen Beispiel

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

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
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()

int main(int argc, char* argv[])
{
 vector<int> V1;
 V1.push_back(5);
 V1.push_back(9);
 V1.push_back(2);
 vector<int>::iterator iter;
 iter = find_if(V1.begin(),V1.end(),/* ??? */);
 if (iter!=V1.end()) cout << *iter << endl;
 else cout << "Nichts gefunden!" << endl;
 return 0;
}

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.
Eine solche Veränderung eines Elementes kann jedoch nicht im find_if()-Aufruf selbst erfolgen, weil find_if() ein nichtmodifizierender Algorithmus ist.

Jetzt müssen wir noch die Stelle für den dritten Parameter beim Aufruf von find_if() füllen. Das ist das sogenannte Prädikat. Die Erstellung des Prädikats folgt auf der nächsten Seite.