vector & resize



  • Hi!

    Ich habe ein Problem mit der resize Methode von std::vector.

    Ich habe eine Klasse CEngine mit einem vector:

    std::vector<std::vector<std::vector<CObject*> > > m_Spielfeld;
    

    Diesen vector will ich dann dynamisch erweitern können.
    Dafür hab ich folgende Methode geschrieben, allerdings hängt sich das Programm beim Aufruf der Methode auf.
    Weiß jemand, was ich falsch gemacht habe?
    Ist das überhaupt der richtige weg?

    void CEngine::CreateGame(const unsigned int& Width, const unsigned int& Height)
    {
    	m_Spielfeld.resize(Width);
    	for(unsigned int i = 0; Width - 1; i++);
    		m_Spielfeld[i].resize(Height);
    }
    

    Ich benutze MS VC 6.0, falls das von interesse ist...

    mfg
    Brian



  • landest in ner endlosschleife?
    dann schau dir dein for nochmal an:

    for(unsigned int i = 0; Width - 1; i++);

    das muss heissen:
    for(unsigned int i = 0;i<=Width - 1; i++);



  • Oh mein Gott!
    So ein dummer Fehler!
    Wie peinlich...



  • so lange das system speicher hat kannst du beliebig elemente in deinen vector reinpacken... das resize ist nur zur laufzeitoptimierung da... wenn du schon in etwa abschätzen kannst wie viele elemente dein vector haben willst kannst du damit verhindern das der ständig nachallokieren und umkopieren muss...
    da ist aber meist nicht wirklich so viel performance zu holen, da der vector exponentiel wächst...



  • wie funktioniert son dynaischer Vector überhaupt? Ich kann mir das nciht so recht vorstellen, denn es gibt da ja eben den direktzugriff. Erstellt er für jedes push_back nen neues Array um eins größer als das alte und kopiert da alles aus dem alten rein und fügt das neue hintendran oder wie funzt sowas?



  • quark er erstellt beim constructor erstmal platz von sagen wir mal 100 einheiten(ka wieviel genau).
    dann kannste mit push_back solange objekte einfügen, bis du am ende des allokierten platzes angekommen bist.

    beim 101. pushback verdoppelt er direkt den speicher, dh er macht aus 100 200 400 800 1600 usw.

    aufjedenfall kopiert er dann den gesamten vector darein, und du hast nochmal den gleichen platz frei, wie der vector vorher belegt hat.



  • Windalf schrieb:

    das resize ist nur zur laufzeitoptimierung da... wenn du schon in etwa abschätzen kannst wie viele elemente dein vector haben willst kannst du damit verhindern das der ständig nachallokieren und umkopieren muss...

    Nein, dafür ist reserve() da, das ändert die Kapazität (capacity()) des Vektors. resize() ändert wirklich die tatsächliche Größe (size()) des Vektors, die beim Zugriff auch nicht überschritten werden darf.

    Oh, und "const unsigned int&": Die Referenz ist bei eingebauten Typen keine Optimierung und das const ist zumindest unüblich, wenn es sich um keine Referenz handelt...



  • @void
    ups asche auf mein haupt...


Anmelden zum Antworten