STL Liste Inhalte ausgeben

Dolphon

Erfahrenes Mitglied
Hi,

ich bin von einer selbstgeschriebenen Klasse Liste auf die STL::List am umsteigen.

Wie kann ich alle Objekte solch einer Liste ausgeben.

z.B
C++:
list <Object> objectliste;

nun will ich für jedes Objekt die Funktion Print in der Klasse Object aufrufen:

So klappt es schonmal nicht.
C++:
objectliste[i].Print();
 
Hallo Dolphon,

dazu gibt es in der STL Iteratoren:
C++:
std::list<Object>::const_iterator it;
for (it = objectliste.begin(); it != objectliste.end(); it++) {
  it->Print();
}
Dabei habe ich angenommen, dass die Methode Print als const deklariert wurde. Ansonsten musst du eben statt einem const_iterator einen iterator verwenden.

Grüße, Matthias
 
Hi.

Oder mehr funktional:
C++:
std::for_each(objectliste.begin(), objectliste.end(), std::mem_fun_ref(&Object::Print));
Man könnte allerdings auch einen operator<< Operator für die Klasse definieren, dann könnte man einen std::ostream_iterator mit der std::copy Funktion verwenden.

Gruß

PS @Matthias: den Präinkrementoperator zu verwenden ist meistens günstiger
 
Zuletzt bearbeitet:
Danke für die Infos,

Wo wir gerade schon einmal bei der STL List sind.

Mein sortieren der Liste will nicht so ganz:

Code:
bool &ObjectManager::compareProfit(const Object &,const Object &)' : overloaded function differs only by return type from 'bool ObjectManager::compareProfit(const Object &,const Object &)'


C++:
bool &ObjectManager::compareProfit(const Object& left, const Object& right)
{
	return left.get_profit() < right.get_profit();
}

void ObjectManager::sortieren()
{
	objectliste.sort(compareProfit);
}
 
PS @Matthias: den Präinkrementoperator zu verwenden ist meistens günstiger
Ach, bei einem guten Compiler macht das keinen Unterschied, der optimiert das weg ;) Ich verwende normalerweise auch ein Präinkrement, aber da in der Literatur in Zählschleifen meistens ein Postinkrement verwendet wird, wollte ich hier auch dabei bleiben. Nicht dass jemand meint, man müsste bei einem Iterator zwingend den Präinkrement-Operator verwenden (ist natürlich nicht der Fall, klappt beides mit der erwarteten Semantik).

Grüße, Matthias
 
Hi.

Oder mehr funktional:
C++:
std::for_each(objectliste.begin(), objectliste.end(), std::mem_fun_ref(&Object::Print));
Man könnte allerdings auch einen operator<< Operator für die Klasse definieren, dann könnte man einen std::ostream_iterator mit der std::copy Funktion verwenden.

Gruß

PS @Matthias: den Präinkrementoperator zu verwenden ist meistens günstiger

Hallo deepthroat,

kannst du vielleicht beispielhaft deine letzte Idee it dem <<operator posten?
Ich habe hier ein Skript in dem das mein Prof gemacht hat, aber viel zu kompliziert.
Ich habe eine Liste mit dem typ die klasse "User", also:

list<User>userList;

Wäre dankbar für eine Antwort
Gruß
 
Hi.
Hallo deepthroat,

kannst du vielleicht beispielhaft deine letzte Idee it dem <<operator posten?
Ich habe hier ein Skript in dem das mein Prof gemacht hat, aber viel zu kompliziert.
Ich habe eine Liste mit dem typ die klasse "User", also:

list<User>userList;
C++:
std::ostream& operator<<(ostream& out, const User& user) {
  return out << user.getName(); // was auch immer
}

std::copy(userList.begin(), userList.end(), std::ostream_iterator<User>(cout, "\n"));
Gruß
 
Hi.
Code:
bool &ObjectManager::compareProfit(const Object &,const Object &)' : overloaded function differs only by return type from 'bool ObjectManager::compareProfit(const Object &,const Object &)'
Wie's da steht: du hast versucht eine Methode zu überladen was auf diese Art nicht möglich ist.

Wozu willst du da eine Referenz zurückgeben? Und vor allem: Worauf?
C++:
bool &ObjectManager::compareProfit(const Object& left, const Object& right)
{
	return left.get_profit() < right.get_profit();
}
Du gibst hier eine Referenz auf einen temporären Wert zurück. Das führt zu undefiniertem Verhalten.

Gruß
 
Hi.
C++:
std::ostream& operator<<(ostream& out, const User& user) {
  return out << user.getName(); // was auch immer
}

std::copy(userList.begin(), userList.end(), std::ostream_iterator<User>(cout, "\n"));
Gruß


Erstmal danke.
Hab das genauso gelöst. Mein Problem ist jetzt noch, dass die User-Objekte alle in einer liste gespeichert wurden und ich nicht weiß, wie ich die Objekt der Liste ansprechen kann, um von denen die get-Funktionen aufrufen zu lassen.
Der Überladene Operator bekommt also kein einzelnes Objekt in seine Funktion rein, wie im Beispiel, sondern die Liste.
Wie gesagt ist meine Frage jetzt wie ich auf die Objekt der Liste zugreifen kann.

Gruß

EDIT:
Habe es jetzt etwas abgeändert - jetzt hat er ein Problem mit dem <<operator bzw dem Iterator.
Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const User' akzeptiert (oder keine geeignete Konvertierung möglich)
Hier mein Code bis jetzt:

Code:
template < typename T > void printList( const std::list< T > &listRef );
ostream& operator<<(ostream& out,User&);

template < typename T > void printList( const std::list< T > &listRef )
{
	std::ostream_iterator< T > output( cout, " " );
	std::copy( listRef.begin(), listRef.end(), output );

}

ostream& operator<<(ostream& out,User& temp) 
{
	return out << temp.getPass()<<temp.getUser(); 
}
 
Zuletzt bearbeitet:
Zurück