C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Rückgabe von Datenstrukturen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Brueckner
Guest





PostPosted: Sat Nov 22, 2003 11:40 am    Post subject: Rückgabe von Datenstrukturen Reply with quote



Moin,

sagen wir mal, ich habe eine Datenstruktur, zum Beispiel einen Baum und
möchte daraus nach bestimmten Kriterien Elemente raussuchen und als
Liste zurückliefern. Meine bisherige Variante war, die Elemente in eine
std::list zu kopieren und diese dann zurückzuliefern. Dummerweise würde
ja sowas:

std::list<Element> getList()
{
std::list<Element> tmp;
//tmp befüllen
return tmp;
};

sämtliche Elemente der Liste (welche ja erst aufgebaut wird in der
Funktion) nochmal (potentiell 2x, einmal auf den Stack und zum zweiten
beim zuweisen des Rückgabewertes an eine Variable) kopiert werden. Je
nach Anzahl der Elemente in der Liste und deren Größe ist das
unerwünscht.

Eine Abänderung auf std::list<Element> &getList() funktioniert auch
nicht, da ja die Variable tmp vernichtet wird, wenn ich den Vereich der
Funktion verlasse. Einzige Lösung, die mir gerade einfällt wäre
folgende:

std::list<Element> *getList()
{
std::list<Element> *tmp = new std::list<Element>();
//tmp befüllen
return tmp;
};

Zeiger verwende ich allerdings nur dann, wenn ich sie absolut nicht
vermeiden kann. Ist das so ein Fall oder gibt es eine bessere Lösung?

Markus
--
Unter Fernwartung versteht man bei MS vermutlich fernschaltbare
Steckdosen ... natuerlich per
Keypress-over-Hausmeister-over-Voice-over-Phone Protokoll.
- Alexander Schreiber in dcsm

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Andreas Goebel
Guest





PostPosted: Sat Nov 22, 2003 1:03 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote



Markus Brueckner wrote:

Quote:
Moin,

sagen wir mal, ich habe eine Datenstruktur, zum Beispiel einen Baum und
möchte daraus nach bestimmten Kriterien Elemente raussuchen und als
Liste zurückliefern. Meine bisherige Variante war, die Elemente in eine
std::list zu kopieren und diese dann zurückzuliefern. Dummerweise würde
ja sowas:

std::list<Element> getList()
{
std::list<Element> tmp;
//tmp befüllen
return tmp;
};

sämtliche Elemente der Liste (welche ja erst aufgebaut wird in der
Funktion) nochmal (potentiell 2x, einmal auf den Stack und zum zweiten
beim zuweisen des Rückgabewertes an eine Variable) kopiert werden. Je
nach Anzahl der Elemente in der Liste und deren Größe ist das
unerwünscht.

Eine Abänderung auf std::list<Element> &getList() funktioniert auch
nicht, da ja die Variable tmp vernichtet wird, wenn ich den Vereich der
Funktion verlasse. Einzige Lösung, die mir gerade einfällt wäre
folgende:

std::list<Element> *getList()
{
std::list<Element> *tmp = new std::list<Element>();
//tmp befüllen
return tmp;
};

Zeiger verwende ich allerdings nur dann, wenn ich sie absolut nicht
vermeiden kann. Ist das so ein Fall oder gibt es eine bessere Lösung?

Markus
Ich würde sogar noch weiter gehen, und in die Liste Zeiger hineintun.


Die andere Möglichkeit, wenn Du partout keine Zeiger verwenden willst:
Du übergibst Deiner Funktion getList als Parameter eine Referenz auf
eine solche Liste und befüllst dann diese. Also:

void getList(list<Element>& tmp){
tmp befüllen;
return;
};

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Hendrik Sattler
Guest





PostPosted: Sat Nov 22, 2003 1:24 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote



Markus Brueckner wrote:
Quote:
sagen wir mal, ich habe eine Datenstruktur, zum Beispiel einen Baum und
möchte daraus nach bestimmten Kriterien Elemente raussuchen und als
Liste zurückliefern.
std::list<Element> getList()
{
std::list<Element> tmp;
//tmp befüllen
return tmp;
};

Das hatte ich neulich auch mal gefragt :)

Ich bin dann auf folgende Lösung eingegangen:
void getList ( std::list<Element>& arg) {
//arg füllen
}

weil ich die Pointer-Variante auch nicht mochte.
auto_ptr wurde damals auch noch empfohlen, die Benutzung desselben empfinde
ich aber als sehr...ähm...ungünstig.

HS

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Brueckner
Guest





PostPosted: Sat Nov 22, 2003 2:02 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote

Andreas Goebel <a-goebel_nospam_ (AT) gmx (DOT) de> wrote:

Quote:
Ich würde sogar noch weiter gehen, und in die Liste Zeiger hineintun.

Die Idee kam mir auch schon. Aber so ganz einig bin ich mir da noch
nicht.

Quote:
Die andere Möglichkeit, wenn Du partout keine Zeiger verwenden willst:

Du übergibst Deiner Funktion getList als Parameter eine Referenz auf
eine solche Liste und befüllst dann diese. Also:

void getList(list<Element>& tmp){
tmp befüllen;
return;
};

So war die allererste Implementierung. Allerdings hatte ich da
Bauchschmerzen, weil entweder der Aufrufende sicherstellen muss, daß die
Liste leer ist oder die Funktion leert sie. Bei beiden Fällen hab ich
so lange pro und contra gefunden, bis ich endgültig kapituliert habe.

Markus, vielleicht sollte ich nach der "gut genug" Schnittstelle suchen
Smile
--
die tonne scheisst auf dein smilie, vor
der tonne sind wir alle gleich.
- hoosiak in fem.flame
http://www.das-motto-des-tages.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sat Nov 22, 2003 4:00 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote

Markus Brueckner wrote:

Quote:
Andreas Goebel <a-goebel_nospam_ (AT) gmx (DOT) de> wrote:

Ich würde sogar noch weiter gehen, und in die Liste Zeiger hineintun.

Die Idee kam mir auch schon. Aber so ganz einig bin ich mir da noch
nicht.

Die andere Möglichkeit, wenn Du partout keine Zeiger verwenden
willst:

Du übergibst Deiner Funktion getList als Parameter eine Referenz auf
eine solche Liste und befüllst dann diese. Also:

void getList(list<Element>& tmp){
tmp befüllen;
return;
};

So war die allererste Implementierung. Allerdings hatte ich da
Bauchschmerzen, weil entweder der Aufrufende sicherstellen muss, daß
die Liste leer ist oder die Funktion leert sie. Bei beiden Fällen hab
ich so lange pro und contra gefunden, bis ich endgültig kapituliert
habe.

Markus, vielleicht sollte ich nach der "gut genug" Schnittstelle
suchen
Smile

die Liste als return-Wert rauszugeben ist nicht unbedingt ineffizient.
Gute Compiler untertstützen die Vermeidung einer Kopie als Optimierung.
Im Prinzip funktioniert das z.B. so, daß der Aufrufer den Speicher zur
Verfügung stellt und deiner Funktion als verstecketen zusätzlichen
Parameter einen Zeiger darauf übergibt. Die konstruiert dann die Liste
direkt in diesen Speicher hinein, und die Kopie wird überflüssig. Die
C++-Norm erlaub das auch explizit.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Sat Nov 22, 2003 4:34 pm    Post subject: Re: R374ckgabe von Date... ^ Reply with quote

Markus Brueckner wrote:

Quote:
Zeiger verwende ich allerdings nur dann, wenn ich sie absolut nicht
vermeiden kann. Ist das so ein Fall

Eher nein.

Quote:
oder gibt es eine bessere Lösung?

Ja, der Aufrufer stellt das Objekt bereit und die Funktion befüllt
es lediglich. Das erlaubt es zusätzlich, immer wieder das gleiche
Objekt zu benutzen, also:

void getList (std::list<Element> &list);

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Sat Nov 22, 2003 4:36 pm    Post subject: Re: R374ckgabe von Date... ^ Reply with quote

Markus Brueckner wrote:

Quote:
So war die allererste Implementierung.

Dabei würde ich bleiben.

Quote:
Allerdings hatte ich da
Bauchschmerzen, weil entweder der Aufrufende sicherstellen muss, daß die
Liste leer ist oder die Funktion leert sie. Bei beiden Fällen hab ich
so lange pro und contra gefunden, bis ich endgültig kapituliert habe.

Wo ist denn nun genau das Problem? Der Aufrufer übergibt die Liste.
Ob sie leer oder vielleicht gefüllt ist, kann er selbst entscheiden.
Es kann ja Fälle geben, wo man was *hinzufügen* möchte.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Kai Ruhnau
Guest





PostPosted: Sun Nov 23, 2003 7:38 pm    Post subject: Re: R374ckgabe von Date... ^ Reply with quote

Am Sat, 22 Nov 2003 17:34:09 +0100 schrieb Marco Budde:

Quote:
Markus Brueckner wrote:

[...]
oder gibt es eine bessere Lösung?

Ja, der Aufrufer stellt das Objekt bereit und die Funktion befüllt
es lediglich. Das erlaubt es zusätzlich, immer wieder das gleiche
Objekt zu benutzen,

Dann könnte man aber auch direkt zu Iteratoren übergehen

template<class It>
It my_fill(It begin, It end)
{
while((begin!=end)||(anderebedingung))
{
//befüllen
++begin;
}
return begin;
}

Grüße
Kai

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Peter Racz
Guest





PostPosted: Mon Nov 24, 2003 8:45 am    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote

Hallo Markus,

Was spricht dagegen, die Liste beim Anrufer zu erzeugen und einen
Referenz oder einen Iterator zu übergeben?

Für mich wäre so eine Lösung auch übersichtlicher: Ich brauche eine
Liste, dann erzeuge ich eine Liste, laß ich sie befüllen, manipulieren,
etc. und zum Schluß vernichte ich sie. Zum Befüllen und Manipulieren
kann ich Funktionen schreiben, die zwischen Erzeugung und Löschen
aufgerufen werden. Dadurch habe ich die Chance, daß new und delete
relativ nah zueinander im Code stehen, möglichst in der selben Funktion
oder zumindest in der selben Klasse. Noch schöner ist, wenn man new und
delete gar nicht braucht, sondern nur eine Variable, dessen natürliche
Scope ausreicht.

Dein folgender Ansatz

std::list<Element> *getList()
{
std::list<Element> *tmp = new std::list<Element>();
//tmp befüllen
return tmp;
};

führt dazu, daß new und delete hoffnungslos im Code verstreut werden,
was zu wohl bekannten Problemen führen kann.

Gruß
Peter

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
André Pönitz
Guest





PostPosted: Mon Nov 24, 2003 11:04 am    Post subject: Re: R?ckgabe von Datenstrukturen Reply with quote

Andreas Nicolai <Andreas.Nicolai (AT) web (DOT) de> wrote:
Quote:
Hi Markus!

Hab hier noch eine Lösung, die bisher noch nicht diskutiert wurde Smile

Zu Recht.

Quote:
const std::list<Element>& getList() {
static std::list<Element> tmp;
//tmp befüllen
return tmp;
};

// Aufruf
const std::list<Element>& smallerList = getList();

Dann musst Du naemlich ploetzlich sicherstellen, dass getList() nicht
zum zweiten Mal aufgerufen wird, bevor das Ergebnis vom ersten Mal
'verarbeitet' ist.

Andre'

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Andreas Nicolai
Guest





PostPosted: Mon Nov 24, 2003 5:37 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote

Hi Markus!

Hab hier noch eine Lösung, die bisher noch nicht diskutiert wurde :-)

const std::list<Element>& getList() {
static std::list<Element> tmp;
//tmp befüllen
return tmp;
};

// Aufruf
const std::list<Element>& smallerList = getList();

Somit ist die Liste allerdings nur read-only, aber das ist für Deinen Fall
wahrscheinlich ausreichend.

Für die Variante

Big-List -> Filtered-List -> die noch weiter verändern

würde ich auch den "gib die Liste als Parameter" Vorschlag nehmen.

Tschüß - Andreas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Brueckner
Guest





PostPosted: Wed Nov 26, 2003 9:58 pm    Post subject: Re: R?ckgabe von Datenstrukturen Reply with quote

André Pönitz <poenitz (AT) gmx (DOT) net> wrote:

Quote:
Dann musst Du naemlich ploetzlich sicherstellen, dass getList() nicht
zum zweiten Mal aufgerufen wird, bevor das Ergebnis vom ersten Mal
'verarbeitet' ist.

Aufgrund der (später mal) parallelen Struktur des Programms ist das...
ähm... schwierig :)

Markus, mit zuviel Zeit und Lektüre von RFC 1034/35
--
Und dcsf kriegen wir schon saubergehalten. Selbst wenn wir uns
irgendwann in
de.comp.security.ein_kleines_unbeugsames_dorf_inmitten_von_gallien
umbenennen muessen =8-] - Urs Traenkner in dcsf

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Brueckner
Guest





PostPosted: Wed Nov 26, 2003 10:01 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote

Kai Ruhnau <kai.newsgroup (AT) tragetaschen (DOT) dyndns.org> wrote:

Quote:
Dann könnte man aber auch direkt zu Iteratoren übergehen

Das ist schon wieder zu flexibel (vom jetztigen Standpunkt aus). Ich hab
mich dann doch letztens für die Variante mit dem Referenzparameter
entschieden.

Markus
--
datensicherung...datensicherung...

da hab' ich mal was von gehört...mal sehen, ob sich das durchsetzt
- BlueBear auf heise.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Brueckner
Guest





PostPosted: Wed Nov 26, 2003 10:02 pm    Post subject: Re: Rückgabe von Datenstrukturen Reply with quote

Marco Budde <mb-news-a (AT) linuxhaven (DOT) de> wrote:

Quote:
Wo ist denn nun genau das Problem? Der Aufrufer übergibt die Liste.
Ob sie leer oder vielleicht gefüllt ist, kann er selbst entscheiden.
Es kann ja Fälle geben, wo man was *hinzufügen* möchte.

Hm, hast ja recht Smile
Ich bleibe in der Tat dabei. Auch wenn das Hinzufügen unnötig sein
sollte, ist es immer gut, man hebt sich die Möglichkeit auf.
Danke nochmal an alle, die geantwortet haben.

Markus
--
"Windows" is not the answer. "Windows" is the question and the answer
is "no". - StickyBit auf heise.de
-
http://www.das-motto-des-tages.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.