Anfängerproblem mit STL und vectoren
-
Hallo,
ich möchte das würfeln mit 5 Würfeln simulieren, bei 3 versuchen.
Die 5 Zufallszahlen zu bekommen und einem vector zuzuweisen ist
ja kein Problem, dann die zuhaltenden Würfel auszuwählen auch nicht.
Aber dann möchte ich die zuhaltenden Würfel gerne in einen anderen
vector verschieben und aus dem ursprünglichen vector löschen.Irgendwie habe ich aber k.A. wie ich das hinbekomme. Ich habe mir
schon die STL-Algorithmen remove_copy, copy und remove angeschaut
aber das ganze nicht hinbekommen(verstanden). Da ich ganz am Anfang
stehe mit dem C++ lernen wäre ich sehr dankbar wenn ich einen möglichst
leicht zu verstehenden Denkanstoss erhalten könnte.
Bin ich da überhaupt auf dem richtigen Wege, mit einem vector oder
muss ich das ganz anders angehen?Vielen Dank
sowatt
-
der ansatz mit der klasse vector ist ok. das entfernen von elementen eines vectors geht mit der methode erase(). du muss aber darauf achten, daß du den rückgabewert von erase() benutzt, um das nächste element im vector zu bestimmen. das machen viele anfänger falsch.
vector<int> elemente_auswaehlen (vector<int> &wuerfe) { vector<int> ergebnis; for(vector<int>::iterator i=wuerfe.begin(); i!=wuerfe.end(); /da kommt NIX hin */) if(<*i auswählen>) { ergebnis.push_back(*i); i=wuerfe.erase(i); // wenn element gelöscht wird, dann nächstes element gleich // rückgabewert von erase() } else ++i; // anderenfalls nächstes element auf normalem wege bestimmen return ergebnis; }wenn du genauer beschreiben würdest, nach welchem verfahren du die zahlen auswählen willst, dann könnte ich dir genaueres sagen.
-
Ich habe bisher gedacht das folgendermaßen zu machen:
cout << "Welche Wuerfel werden gehalten?" << endl; cout << "Bitte die Zahlen der Wuerfel eingeben, Ende mit Buchstabeneingabe!" << endl; for( i = 0; i <= MAXANZ && cin >> x; ++i ) hold.push_back(x); cout << "Die gehaltenen Wuerfel\n" << endl; for( i = 0; i < hold.size(); i++ ) cout << hold[i] << endl; anz = 5 - hold.size(); cout << "Die Anzahl der Wuerfel fuer den naechsten Wurf : " << anz << endl;Dann würde ich gerne mit den verbleibenden Würfeln weitermachen, also alle
die nicht x sind.Vielen Dank
sowatt
-
die funktion wuerfel_halten() entfernt alle nicht zu haltenden würfel aus dem übergebenen vector wuerfel und gibt einen vector der gehaltenen würfel zurück.
vector<int> wuerfel_halten (vector<int> &wuerfel, const vector<int> &halten) { vector<int> gehalten; for(vector<int>::iterator i=wuerfel.begin(), int pos=0; i!=wuerfel.end(); ++pos) if(find(halten.begin(),halten.end(),pos)==halten.end()) i=wuerfel.erase(i); else gehalten.push_back(*i++) return gehalten; }
-
Vielen Dank für den Tipp, das funktioniert jetzt.
MfG
sowatt