std::find-Signatur
-
Hallo!
Ich habe gerade einen
std::find-ähnlichen Algorithmus geschrieben und dabei intuitiv die Signatur wie folgt gestaltet:template<class InputIterator> InputIterator my_find ( InputIterator first, InputIterator last, const typename std::iterator_traits<InputIterator>::value_type& value )Dann hab ich gesehen, dass die Standard-Lib zwei Template-Parameter benutzt (sprich der Typ von
valueist völlig unabhängig von den Iteratoren):template<class InputIterator, class T> InputIterator find ( InputIterator first, InputIterator last, const T& value ) { for ( ;first!=last; first++) if ( *first==value ) break; return first; }Was sind die Vor- und Nachteile der einzelnen Varianten? Bestimmt hab ich bei meiner irgendeinen Denkfehler

-
Bei deiner Variante muss der Typ von value direkt dem value_type des Iterators entsprechen, oder darin umwandelbar sein. Außerdem müssen entsprechende std::IteratorTraits existieren. Bei der Standard Variante muss der Typ von value lediglich mit *iterator vergleichbar sein.
-
Hi dot, danke für die Antwort. Das stimmt wohl. Ist für meine Funktion aber immer gegeben.

Geht das mit der
const-Referenz so, wie ich das gemacht habe, oder muss ich das überstd::add_constmachen (z. B. fallsvalue_typebereits const ist)?
-
Das geht so
Bloops schrieb:
Hi dot, danke für die Antwort. Das stimmt wohl. Ist für meine Funktion aber immer gegeben.

Die Frage sollte aber nicht sein was in der Regel immer gegeben ist, sondern was rein logisch gesehen das Requirement an den Typ ist und nicht mehr und nicht weniger

Und für find() wäre das wohl Vergleichbarkeit und nicht Umwandelbarkeit...