Parametrisierung von Algorithmen mit Funktionsobjekten
Content |
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:
template<typename IT, typename P> 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:
std::vector<std::string> a = {"hello", "Hallo", "willkommen"}; std::vector<std::string> 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.