null-zeiger oder [böse] referenz



  • hi,

    ich habe eine suchfunktion, die eine liste zurückgibt. was ist besser: (bzw, was ist überhaupt legal...)

    list< mein_typ > & find( string )
    {
        static list< mein_typ > empty_list;
        if( /* was gefunden */ )
            return das_gefundene;
        else
            return empty_list;
    }
    

    oder

    list< mein_typ > * find( string )
    {
        static list< mein_typ > empty_list;
        if( /* was gefunden */ )
            return &das_gefundene;
        else
            return NULL;
    }
    

    eine kopie möchte ich nicht zurückgeben. ich würde zum ersten tendieren, aber geht das überhaupt?



  • Was soll find tun und was ist das ominöse das_gefundene?
    Auf jeden Fall solltest du aber mir Referenzen aufpassen, da damit die empty_list verändert werden kann.



  • keins von beidem, das macht man etwa so:

    template<class Iterator, class Inserter>
    void mySearchFunc(Iterator begin, Iterator end, Inserter in)
    {
        /* fügt alle gefundenen Sachen in den Inserter ein ... */
    }
    

    Aufruf:

    mySearchFunc(myString.begin(), myString.end(), back_inserter<list<myType> >(myList));
    


  • .filmor schrieb:

    Auf jeden Fall solltest du aber mir Referenzen aufpassen, da damit die empty_list verändert werden kann.

    autsch. stimmt. ich könnte aber ne const-reference nehmen.

    mir ist auch gerade aufgefallen, dass find() nur ein element zurückgibt, und zwar pair< string, list< typ* > >.



  • doppelmuffe schrieb:

    eine kopie möchte ich nicht zurückgeben.

    warum nicht ?
    Habt nicht so viel Angst vor Performance-Verlust ;)! Die meisten Compiler beherrschen heute das 'Optimieren des Return-Values' recht gut. Zum Beispiel

    list< mein_typ >  find( string ) // Return list<> per Value
    {
        if( /* was gefunden */ )
            return das_gefundene;
        else
            return list< mein_typ >(); // mit leerer Liste zurück
    }
    

    Rufe das so auf:

    list< mein_typ > l = find( aString ); // 'l' wird erst aus dem Return-Wert von find(..) erzeugt
    

    .. dann macht Dein Compiler schon 'alles richtig'. Probier's mal aus und mache im Kopy-Konstruktor von mein_typ 'ne Ausgabe rein, dann siehst Du wie viele oder wie wenige (!) Kopien gemacht werden.

    Ansonsten tendiere ich auch zur gleichen Lösung wie von 'siehe STL' vorgeschlagen.

    Gruß
    Werner



  • hi,

    [quote="Werner Salomon"]

    doppelmuffe schrieb:

    Habt nicht so viel Angst vor Performance-Verlust ;)!

    nee, nocht nicht mal das. wo die listen in diesem fall i.a. sogar recht kurz sein sollten. aber ich wollte auf pair<bla>.second zugreifen können. war aber ne blöde idee.
    dass der compiler die eine überflüssige return-wert-kopie weglässt, wusste ich :p

    naja, jetzt gehts. danke!


Anmelden zum Antworten