sortierter Container: Vergleichsfunktion als Template- oder Konstruktorparameter?



  • Hallo,
    ich will einen eigenen Container (ob als Liste, Array, Baum oder was auch immer spielt wohl keine Rolle), bei welchem die Elemente sortiert eingefügt werden sollen, schreiben.
    Ich weiß, dass es sowas schon gibt und ich es auch nicht besser hinkriege, als das, was es schon gibt, aber um das vernünftig zu lernen und zu verstehen, möchte ich es trotzdem selber "bauen".
    Dazu soll der Benutzer eine vergleichsfunktion definieren und übergeben können, um zu beeinflussen, wie und nach welchen Merkmalen die Elemente sortiert werden. Nun habe ich die Frage, der Container ist ja eh schon ein Template mit dem Inhaltstyp als Parameter, ist es effizienter, diese (optionale) Funktion als weiteren Template-Parameter oder als Parameter im Konstruktor zu übergeben?
    Ergeben sich hier durch irgendeine Version sonstige Nachteile und wenn ja, welche?

    Niko



  • Effizienter ist es sicherlich als Template Parameter. Aber weniger wegen der zusätzlichen Indirektion beim Funktionszeiger, sondern vielmehr wegen Inlining.


  • Mod

    groovemaster schrieb:

    Effizienter ist es sicherlich als Template Parameter. Aber weniger wegen der zusätzlichen Indirektion beim Funktionszeiger, sondern vielmehr wegen Inlining.

    war das nicht der/ein grund, warum man dafür am besten funktionsobjekte benutzt? eine indirektion würde hier ja nur entstehen, wenn operator() virtuell ist, und das ist er sicher nur, wenn man genau das mal braucht.



  • Sicherlich kannst du auch ein Funktionsobjekt nutzen, nur solltest du beachten, dass dieses wiederum Speicher verbraucht (was aber normalerweise irrelevant ist - imo).
    Du kannst aber auch einfach nur 'ne Klasse mit statischer Funktion bereitstellen, kommt halt darauf an, wie du die Schnittstelle definierst.

    // Benutzer definiert folgendes
    struct my_compare
    {
        template <class T>
        static bool make_it_so(const T& lhs, const T& rhs)
        {
            //...
        }
    };
    
    // unser Container
    template <class T, class Compare>
    class my_container
    {
        void foo()
        {
            bool result = Compare::make_it_so(bla, blub);
        }
    };
    

    Funktionsobjekte haben insofern den Vorteil, dass bei unterschiedlichen Compare Typen in der Template Version (obwohl T gleichbleibt) unterschiedliche Container Typen entstehen. Die Frage ist dann nur, ob man genau das will oder eben nicht.


Anmelden zum Antworten