Bestimmte Elemente aus Vektor löschen



  • This post is deleted!


  • vector.erase() hat die Möglichkeit einen Bereich zu löschen https://en.cppreference.com/w/cpp/container/vector/erase

    Du könntest zum Beispiel gucken, wann das nächste Element nicht ein "-" ist (find_if) und von deinem Element bis zum letzten Bindesstrich alles mit erase löschen.



  • @Schlangenmensch wie würde das dann als Code aussehen?


  • Mod

    Die Frage sollte weniger lauten, wie man etwas aus einem Vector löscht (das ist hinreichend dokumentiert), sondern vielmehr, wie ein gutes Datenmodell für dein Problem aussieht.

    Derzeit hat dein Datenmodell ein Problem, nämlich dass etwas, das in der Problemstellung ein "Ding" ist, auf mehrere Dinge im Datenmodell aufgeteilt ist. Zum Beispiel ist ein "Holz" ein Ding, aber es besteht aus "Holz", '-', '-', …
    Das ist nicht nur beim Löschen hinderlich, sondern wird auch an anderen Stellen problematisch, denn du musst immer alles sauber synchron halten, während es schwierig ist, einem der Objekte in deinem Datenmodell anzusehen, zu welchem logischen "Ding" es gehört, und man kann zu einem logischen "Ding" nur schwer rausfinden, welche Objekte dazu gehören.

    Zwei fixe Ideen, wobei ich noch nicht abgewogen habe, was besser ist (und prinzipiell kann ich das auch nicht abwiegen ,denn ich kenne nicht dein vollständiges Problem):
    a) Ein logisches "Ding" trägt eine Information, wie groß es ist, und du lässt die Bindestrich-artigen Objekte komplett weg. Die Programmlogik entscheidet dann, ob ein Platz belegt ist, nicht indem es wirklich an dem Platz guckt (es gibt dann gar keine Plätze mehr), sondern sich aus der Liste der Dinge, ihrer Position, und ihrer Größe ausrechnet, welche Plätze belegt sind
    b) Du bleibst bei deinem jetzigem System, aber die Objekte werden komplexer: Das "Holz" enthält Referenzen auf alles, was derzeit die Bindestriche sind, und die Bindestriche werden dann auch komplexer, sondern enthalten Verweise auf ihr Mutterobjekt. Dann bleibt die Logik deiner Lagerverwaltung so ähnlich wie jetzt, und die Funktionen zum Ändern des Zustands müssen dann damit zurecht kommen, dass ein Objekt aus mehreren Unterobjekten besteht. Das wäre so ähnlich wie es jetzt auch nötig wäre, aber einfacher als ständig Bindestriche zu suchen und zählen.

    (c) Sowohl a) als auch b) fühlen sich für mich schlecht um umständlich an, wenn auch vielleicht anfängerfreundlich. Es gibt hier bestimmt ein genial besseres Modell, aber ohne viel Nachdenken und vor allem Information bezüglich aller Anforderungen kommt man da nicht drauf)



  • @georg1082k Da das deine Hausaufgabe ist: Versuch mal selbst 😉

    Wenn du nicht weiter kommst, kannst du gerne deinen Code zeigen und dazu Fragen stellen. Es gibt dann bestimmt Hilfe.



  • @SeppJ ich persönlich finde die Darstellung mit den Bindestrichen auch ziemlich umständlich, aber das ist die Vorgabe in der Aufgabenstellung.

    Und das bringt mich irgendwie zum Verzweifeln...



  • @Schlangenmensch ich habe leider nur noch wenige Stunden Zeit für die Abgabe und komme echt nicht weiter.. Hier eine stark vereinfachte Version meines Codes:

    vector<string> regal1 = {};		
    vector<string> regal2 = {};
    vector<string> regal3 = {};
    vector<string> regal4 = {};
    vector<string> regal5 = {};
    vector<string> regal6 = {};
    vector<string> regal7 = {};
    vector<string> regal8 = {};
    vector<string> regal9 = {};
    vector<string> regal10 = {};
    
    string ware;
    int groesse;
    string platzhalter = "-";
    int stellplatz;
    
    void einlagern()
    {
         cout << "Geben Sie die einzulagernde Ware ein." << endl;
         cin >> ware;
    
         cout << "Geben Sie die Warengroesse an." << endl;
         cin >> groesse;
    
         regal1.push_back(ware);						// Ware einfügen am Ende
         for (int i = 0; i <= (groesse-2); i++)	    // So viele Platzhalter dahinter einfügen, wie es der Größe der Ware entspricht
         {
              regal1.push_back(platzhalter);
         }
    }
    
                    // usw. für die weiteren Regale
    
    
    void entnehmen()
    {
         cout << "\nGeben Sie die Regalnummer an.\n" << endl;
         cin >> regalnr;
    	
         cout << "\nGeben Sie den Stellplatz des zu entfernenden Elements an.\n" << endl;
         cin >> stellplatz;
    
         if (regalnr == "1")
         {
              regal1.erase(regal1.begin() + stellplatz);
              // Bindestriche löschen ...
         }
    }
    


  • Die exakte Aufgabenstellung wäre auch nicht schlecht... das mit dem Stellplatz sieht komisch aus. Auch für jedes Regal einen Vector anzulegen sieht komisch aus.

    Hier ein Prädikat mit dessen hilfe du mit find_if den Bereich finden solltest, den du löschen möchtest. Ist aber auch wirklich gut dokumentiert: https://en.cppreference.com/w/cpp/algorithm/find muss man nur nachlesen und implementieren. Ist eine Sache von 5 Minuten.

    auto pred = [](const std::string& el){return el != "-";};
    

  • Mod

    edit: Hier stand eine lange Anleitung, aber wenn georg1082k seine Frage unbedingt geheim halten möchte, dann halte ich auch meine Antwort geheim.



  • @georg1082k "Stark vereinfachte" Versionen eines Programms zu posten macht als Anfänger wenig Sinn. Speziell wenn dann nichtmal ne Frage dabeisteht.

    Das ist also dein Code, bzw. eine "vereinfachte" Version davon. OK. Good for you. Viel Spass damit 🙂


Log in to reply