Was haben wir eigentlich?
Wir haben
einen Vektor, mit ein paar Elementen gefüllt,
(Obelix wäre sicher ein mit Hackfleisch gefülltes Wildschwein lieber,
der braucht aber auch weniger seinen Kopf.)
ein Prädikat namens imBereich für zwei Intervallschranken,
(Das sind keine römischen Lagerabsperrungen, durch die die Gallier rennen,
um dem Prädikat eins aufs Dach zu hauen.)
den generischen Algorithmus find_if(), dem wir das Prädikat noch geben müssen.
(Wer ist hier doof? Hier gibts nur einen Doofen und der ist nicht doof!)
Rufen wir also find_if() vollständig auf:
find_if(V1.begin(),V1.end(),imBereich<int>(6,12));
Was geschieht hier eigentlich?
Zuerst wird ein Funktionsobjekt nach der Klasse imBereich<int> angelegt,
wobei dessen Konstruktor mit den Werten 6 (für unten) und 12 (für oben) aufgerufen wird.
Dann wird die Startadresse des Aufrufoperators () des gerade angelegten Objektes an find_if()
als dritter Parameter übergeben.
Nun klappt alles latürnich zusammen.
(Wer jetzt noch prozessiert, kriegts von mir nochmal um die Ohren gehauen!)
... aber ganz friedlich im Unterricht.
Und zum Schluss noch 'mal alles zusammen:
#include <iostream> #include <vector> #include <algorithm> #include <functional> template <typename T> class imBereich : public unary_function<T,bool> { public: imBereich(T u, T o):unten(u),oben(o) {} bool operator()(const T& value) const {return unten<=value && value<=oben;} private: T unten, oben; }; |
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(), imBereich<int>(6,12)); if (iter!=V1.end()) cout << *iter << endl; else cout << "Nichts gefunden!" << endl; return 0; } |