std::list mit Struct



  • Wie kann ich eine Standard list z.b.
    mit diesen struct nutzen

    struct 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
    Schinken

    Stell 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.";
    

Anmelden zum Antworten