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 value ist 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 über std::add_const machen (z. B. falls value_type bereits 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...


Anmelden zum Antworten