====================================================== Parametrisierung von Algorithmen mit Funktionsobjekten [TOC] ====================================================== Vielfach ist es sehr sinnvoll, Algorithmen mit Funktionsobjekten zu parametrisieren. Dies erfolgt grundsätzlich über Template-Parameter, die das Funktionsobjekt über eine Referenz entgegennehmen. Referenzen sind hier sinnvoll, da es theoretisch auch Funktionsobjekte geben kann, die weder kopierbar sind noch sich verschieben lassen. Hier als Beispiel ein Nachbau von `std::find_if`: ---- CODE (type=cpp) ------------------------------------------------------- template auto my_find_if(IT begin, IT end, P& predicate) { while (begin != end) { if (predicate(*begin)) break; ++begin; } return begin; } ---------------------------------------------------------------------------- Aufgabe ======= * Entwickeln Sie einen Algorithmus _compare_, der zwei Iteratorenpaare und ein Prädikat erhält. Das Prädikat vergleicht zwei Werte auf Äquivalenz. Der Algorithmus sollte dann sukzessive beide Objektmengen durchlaufen und aufhören, wenn an einer Stelle die Objekte der beiden Objektmengen nicht als äquivalent betrachtet werden. Beispiel: Wenn Sie _a_ und _b_ miteinander vergleichen und auf `boost::iequals` basierendes Prädikat verwenden, dann sollte _compare_ bei `"willkommen"` vs. `"Willkommen!"` stoppen: ---- CODE (type=cpp) ---------------------------------------------------- std::vector a = {"hello", "Hallo", "willkommen"}; std::vector b = {"Hello", "haLLo", "Willkommen!"}; ------------------------------------------------------------------------- Ebenso sollte natürlich gestoppt werden, sobald bei eine der beiden Objektmengen das Ende erreicht wird. Zurückzugeben ist ein Paar via `std::tuple` oder `std::pair` an Iteratoren. * Schreiben Sie dazu ein kleines Testprogramm. :navigate: up -> doc:index back -> doc:session06/page08 next -> doc:session06/page10