vector oder liste



  • Danke Artchi für deine Hilfe. Da hätte ich aber eine frage. Was meinst du mit delete auf das Object und dann auf null setzen. Mein Vectro sieht so aus.

    struct zahlen{
     int z1;
     int z2;
     int z3;
     int z4;
     int z5;
     int z6;
    };
    
    std::vector<zahlen> syszahlen;
    

    Wenn ich dann eine reihe nicht brauche dann mache ich folgendes;

    if(.....) // wenn diese reihe nicht im spiel...
       syszahlen.z1=0;
    

    Somit weiß ich dann beim auslesen welche reihe nicht mehr dabei ist, wenn halt die erste zahl z1==0 ist.
    Oder gibt es da eine bessere Lösung

    Vieleicht verlange ich viel aber könntest du mir sagen wie das mit einer Liste aussehen würde?



  • (Edit, Original war Nonsens 😉 )

    Nimm doch remove_if() aus <algorithm>, das dürfte maximal eine Zuweisung pro Element verursachen (wohingegen vector::erase bei steigender Elementanzahl _ziemlich_ schnell langsam wird).



  • Wieso testest du die Bedingung nicht gleich beim generieren der Würfe?

    Wenn das nicht geht:

    Kommt ein bißchen drauf an, wie oft du das array durchläufst, und wieviele einträge dann endlich rausfallen.

    Ein Array hat schon einen Vorteil: keinen Speicher-Overhead pro Element, und beim linearen durchrennen geht's auch linear durch den Speicher - da freut sich der Cache.

    andere Möglichkeit wäre: du merkst dir eine Lese- und Schreibposition im Array, und setzt die Schreibposition nicht weiter, wenn ein Satz rausfallen soll. Wenn ein Satz drinbleibt (und Schreibposition != Leseposition) verschiebst du ihn auf die schreibposition.



  • Und was spricht gegen eine Liste?
    uU reicht sogar eine einfach verkettete Liste, dann halbiert sich der Overhead...



  • Gegen eine Liste spricht nur das, dass ich mittendring löschen müßte und das kostet zeit. Mit kommt es halt auf die Geschwindigkeit und nicht so auf den speicher an. Anfangs hatte ich auch ein array. Es lief alles excellent. Einfach nur genial schnell. Doch leideer habe ich das problem dass ich das array global haben muß nud vorher nicht weiß wie groß das wird. Und ein array will ja konstante werde von mir haben. Oder kann mir jemand eine lösung geben wie ich das global und dynamisch mit einem array machen kann?



  • Was spricht gegen eine Liste? Die ist fuer Loeschen in der Mitte perfekt.

    Ein vector IST ein dynamisches Array - es wird dir also kaum gelingen ein eigenes dynamisches Array zu schreiben, das schneller ist.

    Mittels new kannst du aber ein Array dynamisch erzeugen.

    Verwende doch einfach eine Liste.



  • yo, wenn er seine Liste nur in einer Richtung durchläuft, würde sich eine einfach-verkettete Liste lohnen. Für erste Tests kann er aber std::list nehmen, später noch ersetzen wenn es ihm nicht gefällt.

    BlackDragon! Hätte gedacht du hast Pointer drin, und dein "zahlen" per new instanziert. Weil du meintest, du setzt es dann auf null. Und wenn du es nicht mehr brauchst, machste auf deinen vector:

    delete syszahlen[i];
    syszahlen[i] = NULL;
    

    Ok, ansonst kannst du std::list wie vector instanzieren und benutzen, ausgenommen den []-Operator. Es gibt zum list dann passende remove-Methoden und somit hätte sich dein Problem gelöst.



  • wenn man nicht nachlässig programmiert kann man sich das = NULL auch sparen 🙂



  • BlackDragon schrieb:

    Gegen eine Liste spricht nur das, dass ich mittendring löschen müßte und das kostet zeit. Mit kommt es halt auf die Geschwindigkeit und nicht so auf den speicher an. Anfangs hatte ich auch ein array. Es lief alles excellent. Einfach nur genial schnell. Doch leideer habe ich das problem dass ich das array global haben muß nud vorher nicht weiß wie groß das wird. Und ein array will ja konstante werde von mir haben. Oder kann mir jemand eine lösung geben wie ich das global und dynamisch mit einem array machen kann?

    Ich glaub da haste was durcheinander gebracht. vector ist intern ein normales Array, nur siehst du das halt nicht. Wenn du dann mehr Elemente einfügst oder löschst, macht vector alles für dich was du vorher in Kleinarbeit hättest machen müssen.

    std::list dagegen arbeitet anders. Du solltest dir vielleicht mal ein Buch über die STL kaufen? Es gibt nämlich ganze Bücher die allein diese ganzen Container der STL behandeln, und sogar Performance-Formeln dazu angeben. So kann man sich das raussuchen, was am besten für die eigene Aufgabe passt.

    list ist eine verkettete Liste, d.h. pro Element wir ein neues Object mit new angelegt, das für dich widerrum das Element "zahl" enthält. Eigentlich müsste ich jetzt das Prinzip "verkettete Liste" (Linked List) erklären. Aber schau mal bei google nach oder in ein STL-Buch rein.

    list ist beim richtigen Löschen in der "Mitte" am schnellsten bzw. der beste Kompromiss.



  • Hallo, danke an alle für die Hilfe. Vor allem danke an Artchi. Ich werde mir mal ein tutorial über Liste reinziehen und das ganze mit Listen lösen.


Anmelden zum Antworten