STL Vector Grösse



  • Hi !!!

    Ich habe mir ein kleines Testprogramm geschrieben um mir die Kapazität und die Grösse des Vektors vor Augn zu halten und dabei ist etwas rausgekommen, was ich nicht verstehe.

    #include <vector>
    
    int main() {
      vector<int> test;
      test.reserve(10);
      cout << test.capacity() << endl;  //Ausgabe 10  OK
      test[3] = 3;
      cout << test.size() << endl;  //Ausgabe 0 ???  
      for( int i = 0; i < test.capacity(); i++ )
        cout << test[i] << " ";  //Ausgabe  0 0 0 3 0 0 0 0 0    OK
      cout << endl;
    }
    

    Das verstehe ich nicht. Ich dachte, dass wenn ich einen Speicherbereich reserviere für den Vektor, dass dann wenn ich das Element hinzufüge, dass sich die tatsächliche Grösse des Vektors ändert. Ich hatte da 4 erwartet, oder zumindest 1, aber 0 ?
    Das Element ist aber im Vektor drin wie ich an der Ausgabe der einzelnen Elemente sehe. Warum ist die tatächliche Grösse des Vektors immer noch 0 ?
    Wie kann ich sehen wieviele Elemente im Vektor drin sind, ich meine hier das was ich mir unter size() vorgestellt habe, d.h. im oberen Beispiel eine 4 ?



  • Du hast kein Element hinzugefügt.



  • Hallo,

    Elemente fügst du mit push_back hinzu. Reserve ändert die Größe des Vektors nicht. Genau genommen ist dein test[3] = 3; unzulässig.



  • mit reserve stellst Du nur sicher, dass der vector min. 10 Elemente aufnehmen kann, bevor der Speicher neu angefordert werden muss. Um einen vector der Groesse 10 zu erzeugen, musst Du resize(10) benutzen.



  • Hm, doch push_back fügt mir nicht an der 3-ten Stelle was ein sondern am Ende des Vektors und zudem ist es sehr teuer wie ich gelesen habe.
    Muss ich somit erst test.resize() machen und dann die Elemente hinzufügen?
    Doch dann ist mir der Sinn von reserved nicht so ganz klar.



  • Mit reserve() sagt man dem Container sozusagen, was auf ihn zukommt. So kann er sich direkt genug Speicher für die kommenden Elemente sichern.



  • Mit reserve kannst du zum erhindern, dass an zeitkritischen punkten ein resize durchgeführt wird.
    Du kannst natürlich auf das Element mit index 3 zugreifen, nachdem du mindestens vier eingefügt hast.



  • bucada schrieb:

    [...] und zudem ist es [push_back] sehr teuer wie ich gelesen habe.

    Das stimmt nicht! Die push_back-Operation ist sehr schnell.

    <a href= schrieb:

    http://www.cppreference.com/cppvector/push_back.html">push_back() runs in constant time.



  • push_back ist schnell solange kein resize gemacht werden muss, oder?



  • templäd schrieb:

    push_back ist schnell solange kein resize gemacht werden muss, oder?

    Schon, nur ist es halt nicht langsamer, als wenn man erst resize macht und dann über den []operator "hinzufügt". Für's resize ist push_back halt gedacht, und wem es zu lahm ist, der macht halt vorher ein reserve().

    mfg.



  • -predator- schrieb:

    Das stimmt nicht! Die push_back-Operation ist sehr schnell.

    <a href= schrieb:

    http://www.cppreference.com/cppvector/push_back.html">push_back() runs in constant time.

    Das sagt nichts darüber aus, ob es schnell geht. Das bedeutet nur, dass die Zeit unabhängig von der Anzahl der Elemente des vectors ist.



  • Man kann auch im Konstruktor schon eine Größe vorgeben.

    vector<int> test(10);
    

    erzeugt einen vector mit 10 Elementen. d.h. hier wäre test[3] = 1; zulässig und size() würde 10 zurückgeben.



  • Was manche vielleicht stören könnte, ist dass push_back gewöhnlich die Reserve bei zu kleinen vector-Containern verdoppelt.



  • MFK schrieb:

    -predator- schrieb:

    Das stimmt nicht! Die push_back-Operation ist sehr schnell.

    <a href= schrieb:

    http://www.cppreference.com/cppvector/push_back.html">push_back() runs in constant time.

    Das sagt nichts darüber aus, ob es schnell geht. Das bedeutet nur, dass die Zeit unabhängig von der Anzahl der Elemente des vectors ist.

    OK, da hast du natürlich recht; ich hätte noch einen Satz dazu schreiben sollen.
    Nichtsdestotrotz ist push_back() schnell. 🙂


Anmelden zum Antworten