Während des Löschens in einem Vector



  • Welche Variablen denn? Wenn du "player_cards" meinst, die ist ein Teil der Klasse. Und cards ist ja sowieso ein Parameter, pos und card_nr werden auch initiliaziert bevor sie benützt werden? Oder täusch ich mich? (Ist nähmlich erst eines der ersten Übungsprogramme mit C++) 🙂


  • Mod

    Savadiv schrieb:

    Welche Variablen denn? Wenn du "player_cards" meinst, die ist ein Teil der Klasse. Und cards ist ja sowieso ein Parameter, pos und card_nr werden auch initiliaziert bevor sie benützt werden? Oder täusch ich mich? (Ist nähmlich erst eines der ersten Übungsprogramme mit C++) 🙂

    wo denn?



  • und was ist mit pos?
    \edit: verdammt, wieder fehlen mir verdammte siebzehn sekunden 😃


  • Mod

    Andrey schrieb:

    \edit: verdammt, wieder fehlen mir verdammte siebzehn sekunden 😃

    Keine Sorge, ich bin nur selten im Weg.



  • Ah.. Ich hab geglaubt, indem ich advance benütze, dass pos auch automatisch initiliaziert wird. Dankesehr. 🙂



  • aha... und von "irgendetwas" auf "irgendetwas + card_nr" gesetzt wird 😉

    camper schrieb:

    Keine Sorge, ich bin nur selten im Weg.

    wenn du's nicht bist, ist das immer jemand anders... 🤡 aber ich bin immer zu spät^^



  • Du musst pos schon vor advance initialisieren, nämlich mit der "Startposition" von der weg "advanced" werden soll:

    ...
    pos = cards.begin();
    ...
    

    Da "vector" allerdings random-access Iteratoren hat kannst du auf "pos" und "advance" ganz verzichten und es einfach so schreiben:

    cards.erase(cards.begin() + card_nr);
    


  • Danke für die Erklärungen. 🙂

    Ich habe da noch eine Frage, ich lösche ja dann das Element pos aus dem vector. Jedoch treten beim nächsten Aufruf, gleiche Karten bei unterschiedlichen Spielern auf... Pos ist doch gleich wie card_nr, oder?

    Die aktuelle Funktion:

    vector<card> give_cards(vector<card> cards) {
                    vector<card>::iterator pos = cards.begin();
                    int card_nr = 0;
                    for (short int loop = 0; loop < 5; ++loop) {
                            card_nr = rand() % cards.size();
                            advance(pos, card_nr);
                            player_cards.push_back(cards[card_nr]);
                            cards.erase(pos);
                    }
                    return cards;
            }
    

    Ich benutze die Funktion so, damit "cards" aktualisiert wird:

    cards = pl1.give_cards(cards);
    cards = pl2.give_cards(cards);
    

    Dennoch krieg ich eine Karte zwei Mal.



  • sag mal, du hast doch einfach einen stapel mit karten oder? wär's da nicht einfacher, ein statisches bool-array mit 32-(oder wieviel karten hast du da?)-elementen anzulegen, und einfach jedes mal markieren: karte da /karte nicht da??

    ansonsten wie gesagt: schmeiss die "advance" funktion und "card_nr" komplett raus. Hast doch random access aufs ganze array... wählst ne beliebige karte und schmeisst die raus, fertig...



  • EDIT: war unsinn...
    EDIT2: du musst "pos" IN DER SCHLEIFE direkt vor "advance" auf "cards.begin()" setzen, sonst schiebst du die Position ja immer weiter.
    Bzw. gleich ganz weglassen.



  • Savadiv schrieb:

    vector<card> give_cards(vector<card> cards)
    

    Die Funktion bekommt eine Kopie deines Kartenstapels übergeben und nimmt dann Karten von dieser Kopie. Der Originalstapel wird davon überhaupt nicht berührt. Als Lösung mußt du den Kartenstapel als Referenz übergeben:

    void give_cards(vector<card>&cards);//beachte das &
    


  • Nein, muss er nicht, denn er gibt den modifizierten Kartenstapel als Returnwert zurück.
    Ist zwar etwas doof gelöst, funktioniert aber.



  • hustbaer schrieb:

    Nein, muss er nicht, denn er gibt den modifizierten Kartenstapel als Returnwert zurück.

    OK, stimmt - dann Kommando zurück. Aber die Version mit der Referenz ist imho günstiger (und drückt klarer aus, was die Funktion macht - von den Performance-Vorteilen will ich gar nicht erst anfangen).


Anmelden zum Antworten