vectoren entleeren?



  • *lol* an einem tag gleich 3 neue threads in diesem forum angefangen 😃

    wenn ich einen vector deklariere und mit der push_back funktion in einer for-schleife fülle, dann aber im programm wieder vor die for-schleife springe (entweder durch while oder auch dem verhassten goto), wie kann ich sicherstellen, dass ich den vector vor der for schleife wieder leere?

    meinetwegen heißt der code so oder ähnlich:

    #include <iostream>
    #include <vector>
    #include <string>
    
    int main() {
       std::vector<std::string> S;
       bool gotolabel;
    
    start:
       /*An dieser stelle muss ich dafür sorgen, dass mein vector leer wird!!!*/
    
       for (int i=0; i<10; i++) {
          S.push_back("Hallo Welt");
       }
    
       for (int i=0; i<S.size(); i++) {
          std::cout << S[i] << endl;
       }
    
       if (gotolabel) {
          goto start;
          gotolabel = false;
       }
    
       getch();
       return 0;
    }
    


  • S.clear(); würde ich vermuten.



  • Lass das goto weg und nimm stattdessen eine Schleife. while oder do-while vorzusgweise. Goto ist nicht falsch, aber es ist unschön und stößt bei den meisten auf großes Misfallen.

    http://tutorial.schornboeck.net/schleifen.htm



  • ich kenne schleifen 🙂 so blutiger anfänger bin ich auch nicht wieder 😃 den link hätte ich nicht gebraucht...

    aber wieso ist goto eigentlich so verhasst? ich finde es ganz nützlich, wenn man es nicht zu oft einsetzt...



  • Mi schrieb:

    aber wieso ist goto eigentlich so verhasst? ich finde es ganz nützlich, wenn man es nicht zu oft einsetzt...

    Du schreibst solchen Code und fragst trotzdem noch? 😃
    Kommt nicht auf das wie oft an sondern das wie, insbesondere wenn es geschicktere Alternativen gibt.



  • Wenn du Schleifen richtig verstanden hast, brauchst du kein goto.



  • "gotolabel = false;" wird nie erreicht oo



  • Problematisch wird goto so richtig, wenn man Initialisierungen überspringt. Das kann schonmal wüste Probleme geben.

    Zu vector.clear sollte man noch sagen, dass ein Vektor den Speicher, den er einmal besitzt, nicht wieder freigibt.

    Z.B.:

    vector<int> v( 100000, 0);
    v.clear(); /// Speicher immernoch belegt
    v.reserve( 0); ///< kein Effekt, Speicher immernoch belegt
    

    Wenn man aber das erreichen will, sollte man folgendes machen:

    template< class Vector>
    void clearVector( Vector& v);
    {
      Vector tmp; ///< leeren Vektor anlegen
      v.swap( tmp); ///< und Inhalte tauschen
    }
    
    ...
    vector<int> v( 100000, 0);
    clearVector( v); ///< Speicher ist wieder freigegeben
    


  • stimmt es mit
    v.swap( tmp); ///< und Inhalte tauschen !!!

    in dem Fall wird tmp umsonst speicher belegen



  • Es ist beabsichtigt und gewollt in der STL, dass ein vector nur wächst in seinem Speicherverbrauch.

    In dem Beispielcode wird jetzt ein Vektor ohne Speicher angelegt. Der tauscht dann per Swap (und damit auch der besessene Speicher) mit dem übergebenen Vektor seine Plätze. Anschließend wird tmp, und damit der reservierte Speicher, zerstört.


Anmelden zum Antworten