Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Vector erweitern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.05.2005, 18:47 Uhr
~MR
Gast


Hallo Forum
Wie kann man im Programmverlauf einen 3D Vector dynamisch vergrössern?


C++:
void Test_3D()
{
    int i;
    int j;
    int k;
    int a;
    int max1 = 0;
    int max2 = 0;
    int max3 = 0;

    std::vector<std::vector<std::vector<int> > > DreiDArray;

    DreiDArray.resize(3);
    for(i = 0; i < 3; i++){
        DreiDArray[i].resize(3);
    }
    for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++){
    DreiDArray[i][j].resize(3);
       }
    }
    for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++){
    for(k = 0; k < 3; k++){
        DreiDArray[i][j][k] = 5;
    }
        }
    }
    max1 = DreiDArray.capacity ();
    max2 = DreiDArray[0].capacity ();
    max3 = DreiDArray[0][0].capacity ();

    //Hiernach möchte ich alle 3 Dimesionen um 1 vergrössern
    }


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.05.2005, 18:37 Uhr
~MR
Gast


Ist die Vector Klasse nicht fähig eine Instanz dynamisch zu erweitern?
Muss man einen neuen Vector generieren, den alten reinkopieren und
dann den alten löschen?

Gruss MR
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.05.2005, 07:43 Uhr
doppler



Du hast den vector schon vorher erweitert, schreib einfach statt resize(3) resize(4):

C++:
    DreiDArray.resize(4);
    for(i = 0; i < DreiDArray.size(); i++){
        DreiDArray[i].resize(4);
    }
    for(i = 0; i < DreiDArray.size(); i++){
        for(j = 0; j < DreiDArray[i].size(); j++){
    DreiDArray[i][j].resize(4);
       }
    }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.05.2005, 18:46 Uhr
~MR
Gast


Hallo
So schlau war ich auch schon.
Das ist es aber nicht was ich will.
Es soll zur Laufzeit erweitert werden, sonst kann ich ja gleich ein 3d array nehmen.
int 3Darray[3][3][3];

Gruss MR
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.05.2005, 18:58 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


der vector hält speicher vor damit er nicht ständig nachallokieren muss... machst du dies in zwei dimensionen wird das schon ein echter speicherfresser... gehts du dann auf 3 dimensionen ist es imho schon fast nicht mehr sinnvoll vector zu verwenden... du kannst ein 3 dimensionales array auch abbilden durch ein 1dimensionales array und musst dann nur mit den idices rumrechnen... (beim vergrössern des vectors wäre dann ein verschieben oder komplettes kopieren von nöten was allerdings imho immer noch besser ist als mit hochdimesionalen std::vector's zu arbeiten...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.05.2005, 20:04 Uhr
~MR
Gast


OK
Das war's dann wohl.
Kann mit deinem Vorschlag gut leben, Winalf.

Danke und Tschüss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.05.2005, 08:16 Uhr
doppler




Zitat von ~MR:
Hallo
So schlau war ich auch schon.
Das ist es aber nicht was ich will.
Es soll zur Laufzeit erweitert werden, sonst kann ich ja gleich ein 3d array nehmen.
int 3Darray[3][3][3];

Gruss MR

Wenn das so ist, verstehe ich das Problem nicht. resize() erweitert den vector zur Laufzeit und übernimmt bei Bedarf automatisch das Allokieren.

Windalfs Vorschlag ist gut, um Speicher zu sparen, aber beim Ändern der Größe und beim Indexzugriff unter Umständen ähnlich schwierig zu handhaben wie ein 3-dimensionales Array. Um die Handhabung etwas komfortabler zu machen, gibt es Slices.

Dieser Post wurde am 19.05.2005 um 08:17 Uhr von doppler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.05.2005, 19:06 Uhr
~MR
Gast


Hier noch mal der Code


C++:
void CVectorTestDlg::Test_3D()
{
    int i;
    int j;
    int k;
    int a;
    int max1 = 0;
    int max2 = 0;
    int max3 = 0;
    
    std::vector<std::vector<std::vector<int> > > DreiDArray;
    
    DreiDArray.resize(3);
    for(i = 0; i < 3; i++){
        DreiDArray[i].resize(3);
    }
    for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++){
            DreiDArray[i][j].resize(3);
        }
    }
    for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++){
            for(k = 0; k < 3; k++){
                DreiDArray[i][j][k] = 5;
            }
        }
    }
    max1 = DreiDArray.capacity ();      // max1 = 3  
    max2 = DreiDArray[0].capacity ();   // max2 = 3
    max3 = DreiDArray[0][0].capacity ();// max3 = 3
    
    
    DreiDArray.resize(5);
    DreiDArray[i].resize(5);
    DreiDArray[i][j].resize(5);
//Hiernach ist max1 bis max3 nicht wie beabsichtig    
    max1 = DreiDArray.capacity ();       // max1 = 6
    max2 = DreiDArray[0].capacity ();    // max2 = 3
    max3 = DreiDArray[0][0].capacity (); // max3 = 3

    for(i = 0; i < max1; i++){
        for(j = 0; j < max2; j++){
            for(k = 0; k < max3; k++){
                a = DreiDArray[i][j][k];
            }
        }
    }
        //Programm bricht hier ab wenn i > 3 ist  
}



Also der Vector funktioniert so nicht

Gruss MR
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.05.2005, 19:34 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ne kleine anmerkung capacity ist im allgemeinen ungleich size... das eine ist die grösse die im speicher freigehalten wird und das andere die anzahl der "validen" elemente die dein vector enthält... mag von implementierung zu implementierung unterschiedlich sein aber im allgemeinen wächst die kapazität exponentiell immer dann wenn size==capacity ist und du noch mindestens eine element hinzufügen willst
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.05.2005, 07:51 Uhr
doppler



Wenn du statt capacity() size() benutzt, sollte max1 5 und nicht 6 sein, max2 und max3 bleiben aber 3, denn nach dem Durchlauf der letzten for-Schleife sind i und j jeweils 3. Wenn du also schreibst

C++:
    DreiDArray[i].resize(5);
    DreiDArray[i][j].resize(5);


werden nur DreiDArray[3] bzw. DreiDArray[3][3] auf die Größe 5 erweitert. Damit bleiben nach Auswertung von

C++:
max2 = DreiDArray[0].size ();
max3 = DreiDArray[0][0].size ();


max2 und max3 3. Wenn du aber

C++:
max2 = DreiDArray[3].size ();
max3 = DreiDArray[3][3].size ();


auswertest, haben max2 und max3 den Wert 5. Um die gesamte Matrix zu vergrößern, musst du wie am Anfang jede Komponente vergrößern:

C++:
    DreiDArray.resize(5);
    for(i = 0; i < 5; i++){
        DreiDArray[i].resize(5);
    }
    for(i = 0; i < 5; i++){
        for(j = 0; j < 5; j++){
            DreiDArray[i][j].resize(5);
        }
    }


Man kann sich DreiDArray als vector vorstellen, bei dem jede Komponente eine Matrix ist. Wenn du diesen vector mit resize() vergrößerst, wird nichts mit den bestehenden Komponenten gemacht, sondern nur Komponenten (Matrizen der Größe 0x0) am Ende angehangen. Genauso ist jedes DreiDArray[i] ein vector, bei dem jede Komponente ein vector ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: