std::list mit Struct
-
Wie kann ich eine Standard list z.b.
mit diesen struct nutzenstruct TChannelData { AnsiString sChanName, //Channel Name sChanTopic, //Channel Topic sChanModes, //Channel Modes sChanText, //Channel Welcome Text sChanPass; //Channel Password int iUserOnline, //Actual User Count iUserLimit; //Channel User Limit };
WIe kann ich bei der std::list dann zb. sChanName einen wert zuweisen?
wie kann ich die liste bis zum ende durchgehen??
PLZ Help
MFG
Schinken
-
Ganz einfach
std::list<TChannelData> channellist; for(int i =0; i < 10; ++i) channellist.push_back(TChannelData()); std::list<TChannelData>::iterator it; for(it = channellist.begin();it != channellist.end(); ++it) { it->sChanModes = "closed"; }
Devil
-
devil81 schrieb:
Ganz einfach
std::list<TChannelData> channellist; for(int i =0; i < 10; ++i) channellist.push_back(TChannelData()); std::list<TChannelData>::iterator it; for(it = channellist.begin();it != channellist.end(); ++it) { it->sChanModes = "closed"; }
Devil
warum TChannelData() ?? ohne () oder?
-
Beides möglich, und beides das selbe ergebnis, der Standard Konstruktor wird aufgerufen.
Devil
-
gibt es n tutorial dafür.. weil sonst check ichs net brauch mehr beispiele... is schon einleuchtend, aber mein nur
Bzw noch einwas:
Was is wenn ich nur einen Datensatz hinzufüge und den gleich werte zuweisen will?
da brauch ich ja schleife usw net.. wie mach ich das dann?
MFG
Schinken
-
Schinken schrieb:
gibt es n tutorial dafür.. weil sonst check ichs net brauch mehr beispiele... is schon einleuchtend, aber mein nur
Bzw noch einwas:
Was is wenn ich nur einen Datensatz hinzufüge und den gleich werte zuweisen will?
da brauch ich ja schleife usw net.. wie mach ich das dann?
MFG
SchinkenStell dir den Obigen Code einfach ohne Schleifen vor *fg*
-
devil81 schrieb:
Beides möglich, und beides das selbe ergebnis, der Standard Konstruktor wird aufgerufen.
Devil
Nein, da muß ich wiedersprechen.
TChannelData hat keinen Default-Konstruktor und zumindest der Standard sagt dazu, das für den Fall TChannelData() die POD Member iUserOnline und iUserLimit auf 0 gesetzt werden (zero initialized) und für TChannelData ohne Klammern undefiniert sind. Für die non POD Member, also die Strings, macht es hingegen keinen Unterschied.
Nicht alle Compiler implementieren das immer so sauber, speziell bei Arrays klappt die zero initialization leider bei einigen nicht.
Ich geb zu, der Unterschied ist fies oder subtil und der Standard alles andere als leicht zu lesen (speziell in dem Bereich hat sich zudem 2003 noch einiges an Formulierungen geändert, aber das vorgeschriebene Verhalten bleibt für diesen Fall wie genannt).
Also am besten selber einen Konstruktor scheiben wenn man PODs hat, dann muß man sich nicht merken ob man den mit oder ohne Klammern erzeugen muß und kann selber festlegen ob und was initialisiert wird, oder von uninitialisierten POD Membern ausgehen.
Es macht natürlich noch einen Performance-Unterschied ob PODs zero initialisert werden müssen oder nicht, darum gibt es wohl auch beide Formen.
-
sagen wir mal ich hätte 20 elemente in der liste, wie kann ich einen neuen am ende erstellen und werte zuweisen?
-
Schinken schrieb:
sagen wir mal ich hätte 20 elemente in der liste, wie kann ich einen neuen am ende erstellen und werte zuweisen?
push_back hängt die neuen elemente immer hinten ein.
-
und um werte zu verändern könntest du dir ein strukt erstellen, es verändern und dann in die liste einfügen:
TChannelData tcd(); tcd.iUserOnline = 1; tcd.sChanText = "A new text for a new channel."; channellist.pushback(tcd);
oder fügst ihn erst ein und änderst ihn dann:
std::list<TChannelData>::iterator it = channellist.insert(TChannelData()); it->iUserOnline = 1; it->sChanText = "A new text for a new channel.";