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


Anmelden zum Antworten