Frage zur Funktion List.push_back()



  • Der unterschied zwischen groupID und group ist der, dass groupID, die ID aus der XML datei enthält über die dann der Name der Gruppe, group, abgefragt und eingefügt werden kann. Das selbe gilt für category / ID.

    Wenn du ohnehin nachgucken musst (bzw. kannst), wieso dann noch mal mit abspeichern?

    Einen für den Import von Daten, eine fürs Arbeiten mit den Beständen. Es ist deshalb getrennt, da beide Listen verglichen werden müssen, damit Gegenstände, die beim import nicht mehr vorhanden sind, nicht aus der Liste gelöscht werden.

    Ist zwar nicht unbedingt für die Aufteilung notwendig, aber iwie hab ich das nicht ganz verstanden:
    Eine für die Teile, die auf der Bestellliste sind und eine für die, die schon verplant sind? und wieso dann nichts löschen oder was? : D

    bool adjusted;
    //adjusted gibt an, ob der Gegenstand, beim Aktualisieren verändert wurde.
    //Wenn nicht ergibt sich, dass der Gegenstand nicht mehr vorhanden ist,
    //also die Stückzahl auf 0 geändert werden muss.

    find ich persönlich eigenartig... aber vll hab ichs auch nicht richtig verstanden...
    warum muss die stückzahl auf 0 geändert werden, wenn hier iwas nicht aktualisiert wurde? Oo

    außerdem würde ich wahrscheinlich nur fkt für itemname etc machen - wenn das performance-technisch zu knapp wird weil jedes mal wieder ne query und du eben 50mal pro sekunde irgend so nen getter aufrufst, würd ich mir vll die letzten query`s + ergebnisse iwo cachen...
    der name gehört iwie nicht zu dem zustand des objektes (ist id 1234 mit name "schraube" was anderes als die id 1234 mit dem veränderten name "Schraube 0815 - super toll im Angebot von Hersteller xyz, genormt nach DIN 456787654678765..."?)
    sieht man bei menschen ja auch schon, dass namen nicht unbedingt perfekt geeignet sind, um sie in listen zu führen sondern eher irgend ne id(steuernr./...) weil Frau Meyer nun mal nach der Hochzeit anders heißt aber trotzdem noch die gleiche ist ^^ (na gut - die Steuer ist hier vll nicht das beste Bsp., weil sich da ja dann schon ne ganze Menge ändert - aber du solltest wissen, worauf ich hinaus will?!)

    bb



  • Ich speicher es deshalb ab, da ansonst bei Suchanfragen jedesmal diese Sachen rausgesucht werden müssen. Es gibt aber über 20.000 Gegenstände im Inventar, über 50.000 Namen für Gegenstände, 12.000 Orte an denen gegenstände sein können, usw.

    Allein nach dem Import die Gegenstände abzugleichen und zu ergänzen, dauerte etwa 15 sekunden bei der letzten Version.
    Es ist viel Laufzeitfreundlicher diese Daten direkt beim Gegenstand zu speichern, um zig Millionen Funktionsaufrufe zu vermeiden 😃

    find ich persönlich eigenartig... aber vll hab ichs auch nicht richtig verstanden...
    warum muss die stückzahl auf 0 geändert werden, wenn hier iwas nicht aktualisiert wurde? Oo

    Ok, ich versuch es mal zu Erklären.
    Sagen wir man hat 10 Gegenstände vom Stück Brot gekauft. Wenn ich also meine Speisekammer abfrage, gibt sie mit zurück, dass 10 Stück Brot da sind, und ich brauche es ned auf die Einkaufsliste zu schreiben

    Ich will aber, dass immer mindestens 5 Stücke Brot da sind, also schreibe ich mir auf, dass vom Gegenstand Brot immer 5 Stück da sein sollen.

    Wenn das Brot alle ist, und ich die Speisekammer wieder abfrage, kann sie mir ja nicht sagen dass kein brot da ist, weil sie kann ja nur zurückgeben was vorhanden ist.

    Also setzte ich auf der Einkaufsliste alle Sachen, die noch vorhanden sind auf true.

    Wenn jetzt irgend ein Gegenstand auf false gesetzt ist, weiß ich, dass mir die SPeisekammer dafür keine Daten geliefert hat, also nichts mehr vorhanden ist.

    😃

    #Edit

    der name gehört iwie nicht zu dem zustand des objektes (ist id 1234 mit name "schraube" was anderes als die id 1234 mit dem veränderten name "Schraube 0815 - super toll im Angebot von Hersteller xyz, genormt nach DIN 456787654678765..."?)

    die typeID ist direkt mit dem Namen verbunden, und wird auch darüber aufgelöst.
    die itemID ist Einzigartig, da ja am Selben Ort, der Gleiche gegenstand, auf verschiedenen Stapeln, oder in verschiedenen Containern sein kann.



  • Wenn das Brot alle ist, und ich die Speisekammer wieder abfrage, kann sie mir ja nicht sagen dass kein brot da ist, weil sie kann ja nur zurückgeben was vorhanden ist.

    wieso kann sie das nicht?

    for each item in speisekammer_inventar_list
       if item.ist_wert < item.soll_wert
          bestelle(item)
    

    vrmtl würde man dann eine map oder (eher) nen set nehmen und über die ID ordnen lassen...
    Am Anfang würd ich eben sagen, welche IDs in der Inventar-Liste stehen und für die Teile, für die ich Daten habe, änder ich den Eintrag im Container halt...

    zu deinem edit:
    naja - wenns sonst zu langsam ist und du permanent wirklich alle daten brauchst, dann wirst du es wohl so machen müssen...
    das die id einzigartig ist hab ich oben schon gelesen und deshalb ja auch die selbe id genommen - und meinte damit, dass das "Brot" vll morgen in "Schwarzbrot" umbenannt werden muss weil es auf einmal auch "Weißbrot" in der Speisekammer gibt... sich dann aber nichts am Objekt an sich geändert hat sondern nur der Verkaufsname sich geändert hat - die Fkt bestellen bsp.weise interessiert das gar nicht, wie du das teil nennst, was sie unter der nr. x kennt und einfach bestellt, wenn es eben nicht mind. n mal vorhanden ist...

    bb



  • wieso kann sie das nicht?

    Es is ne XML abfrage die das ned kann 🙄 ich hab diese nicht entworfen, sondern greife da lediglich über ne Webabfrage drauf zu.

    vrmtl würde man dann eine map oder (eher) nen set nehmen und über die ID ordnen lassen...

    Ich hab ehrlich gesagt noch nie mit maps oder sets gearbeitet.
    Ordnen brauche ich die Einträge nicht, da sie bereits geordnet als XML geladen werden, und auch in dieser Reihenfolge eingelesen werden.

    und meinte damit, dass das "Brot" vll morgen in "Schwarzbrot" umbenannt werden muss weil es auf einmal auch "Weißbrot" in der Speisekammer gibt... sich dann aber nichts am Objekt an sich geändert hat sondern nur der Verkaufsname sich geändert hat

    Die Namen ändern sich nicht, höchstens es ist denen beim Erstellen ein Fehler unterlaufen (Rechtschreibfehler oder so). Jedoch habe ich die Namen, IDs usw. in einer Datei stehen, ändern sich also nur wenn ich es aktualisiere/ändere. Es kommen aber neue Gegenstände hinzu hin und wieder, jedoch haben die dann Eigene IDs



  • Muss leider doppelposten, da mein Edit ein paar posts vorher wohl untergegangen ist.

    #Edit

    Wichtige frage noch.
    Wenn ich z.B. in einer Klasse den wert group über void set_group(std::string &newGroup); ändere, is es dann besser das mit swap() zu machen?

    also

    void Data::set_group(std::string &newGroup){
        std::string to_swap(newGroup);
        swap(to_swap, group);
    };
    
    //oder so?
    void Data::set_group(std::string &newGroup){
        group = newGroup;
    };
    

    Kann es zu Problemen kommen, wenn ich die Klasse dann dynamisch erstelle, bei der 2t. Methode?



  • Der Zuweisungsoperator von std::string macht höchstwahrscheinlich selber ein swap() , also kannst du normal zuweisen. Jedoch solltest du den Parameter als Const-Referenz übergeben, wenn du ihn nicht veränderst.

    Edit: Was für Probleme meinst du? Mir fallen da nicht gerade welche ein.



  • Dass sich dann vllt 2 Objekte auf der selben Speicheradresse befinden.

    Irgendwas sagt mir, da ich ja ned mit Zeigern arbeite hier, dass sowas ned passieren kann, aber ich dacht frag ich lieber mal nach 🙄

    #Edit

    Und was ist mit normalen Typen? int, bool usw? sollte ich die sicherheitshalber mit swap() zuweisen?



  • Nein, du musst jetzt nicht in den swap() -Wahn kommen. 🙂

    Du solltest vielleicht bei grösseren Klassen darauf achten, dass du deinen eigenen Zuweisungsoperator über Copy&Swap implementierst (wenn du ihn implementierst), da das oft effizienter und exceptionsicherer ist. Aber bei PODs wie int , die eh keine Exceptions werfen können, ist eine normale Zuweisung ohnehin am schnellsten. Du musst dir nur überlegen, was swap() macht:

    std::swap(a, b); // a, b sind ints
    
    // expandiert zu:
    swap(int& a, int& b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }
    

    Also hast du drei Zuweisungen statt einer. swap() wird erst schneller, wenn man sich Kopien sparen kann, zum Beispiel durch Zeigertausch bei Containern.

    Generell musst du dir eigentlich keine Gedanken machen, wenn du andere Klassen zuweist. Du darfst normalerweise davon ausgehen, dass diese den operator= gut implementiert haben. Also weise ruhig zu, wenn du eine Zuweisung benötigst, und benutze swap() , wenn du tauschen willst.



  • 😃 Da es hieß das swap() sicherer ist, wollt ich mal "auf nummer sicher" gehen 🙂 aber ok, denk jetzt versteh ich wann ich swap() benutzen kann/soll.



  • Also eines muss ich jetz mal wirklich sagen, DANKE an euch alle 👍

    Der Code ist bis jetzt etwa 10x schneller als der, den ich vorher fabriziert habe, und das nur wegen des Klassendesigns.


Anmelden zum Antworten