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 Beispiellist< 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 :pnaja, jetzt gehts. danke!