dynamische arrays c++?

1 Antwort

Array dynamischer Größe

Das Array dynamischer Größe hat insofern eine dynamische Größe als das beim Überschreiten der aktuell verfügbaren, bereits allozierten Kapazität (c++: capacity) der Inhalt aus dem alten Array in ein neues größeres Array kopiert wird und das alte Array schlussendlich verworfen wird.

Ein Beispiel wäre der Typ std::vector<>:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> myvector;

    int cap ;
    int i_rh{};
    
    for (int i=0; i<100; i++)
    {
        std::cout << "neue Elemente verfuegbar: " << myvector.capacity() - myvector.size() << "\n";

        cap = myvector.capacity();
        if (!(cap - myvector.size()))
        {
            myvector.push_back(i);
            std::cout << "Für Element nummer " << i + 1 << " musste capacity auf " << myvector.capacity() << " (2 hoch " << i_rh++ << ") erhoeht werden, denn vergeben " << i << "/" << cap << " Elemente\n";
            continue;
        }
        myvector.push_back(i);



    }


    std::cout << "size: " << (int) myvector.size() << '\n';
    std::cout << "capacity: " << (int) myvector.capacity() << '\n';
    std::cout << "es wurde insgesamt " << i_rh << " Mal der Speicher für myvector erhöht\n";
    
    }

Der Code gibt auf meinem Gerät

neue Elemente verfuegbar: 0
Für Element nummer 1 musste capacity auf 1 (2 hoch 0) erhoeht werden, denn vergeben 0/0 Elemente
neue Elemente verfuegbar: 0
Für Element nummer 2 musste capacity auf 2 (2 hoch 1) erhoeht werden, denn vergeben 1/1 Elemente
neue Elemente verfuegbar: 0
Für Element nummer 3 musste capacity auf 4 (2 hoch 2) erhoeht werden, denn vergeben 2/2 Elemente
neue Elemente verfuegbar: 1
neue Elemente verfuegbar: 0
Für Element nummer 5 musste capacity auf 8 (2 hoch 3) erhoeht werden, denn vergeben 4/4 Elemente
neue Elemente verfuegbar: 3
neue Elemente verfuegbar: 2
neue Elemente verfuegbar: 1
neue Elemente verfuegbar: 0
Für Element nummer 9 musste capacity auf 16 (2 hoch 4) erhoeht werden, denn vergeben 8/8 Elemente
neue Elemente verfuegbar: 7
neue Elemente verfuegbar: 6
neue Elemente verfuegbar: 5
neue Elemente verfuegbar: 4
neue Elemente verfuegbar: 3
neue Elemente verfuegbar: 2
neue Elemente verfuegbar: 1
neue Elemente verfuegbar: 0
Für Element nummer 17 musste capacity auf 32 (2 hoch 5) erhoeht werden, denn vergeben 16/16 Elemente
neue Elemente verfuegbar: 15
neue Elemente verfuegbar: 14
neue Elemente verfuegbar: 13
neue Elemente verfuegbar: 12
neue Elemente verfuegbar: 11
neue Elemente verfuegbar: 10
neue Elemente verfuegbar: 9
neue Elemente verfuegbar: 8
neue Elemente verfuegbar: 7
neue Elemente verfuegbar: 6
neue Elemente verfuegbar: 5
neue Elemente verfuegbar: 4
neue Elemente verfuegbar: 3
neue Elemente verfuegbar: 2
neue Elemente verfuegbar: 1
neue Elemente verfuegbar: 0
Für Element nummer 33 musste capacity auf 64 (2 hoch 6) erhoeht werden, denn vergeben 32/32 Elemente
neue Elemente verfuegbar: 31
neue Elemente verfuegbar: 30
neue Elemente verfuegbar: 29
neue Elemente verfuegbar: 28
neue Elemente verfuegbar: 27
neue Elemente verfuegbar: 26
neue Elemente verfuegbar: 25
neue Elemente verfuegbar: 24
neue Elemente verfuegbar: 23
neue Elemente verfuegbar: 22
neue Elemente verfuegbar: 21
neue Elemente verfuegbar: 20
neue Elemente verfuegbar: 19
neue Elemente verfuegbar: 18
neue Elemente verfuegbar: 17
neue Elemente verfuegbar: 16
neue Elemente verfuegbar: 15
neue Elemente verfuegbar: 14
neue Elemente verfuegbar: 13
neue Elemente verfuegbar: 12
neue Elemente verfuegbar: 11
neue Elemente verfuegbar: 10
neue Elemente verfuegbar: 9
neue Elemente verfuegbar: 8
neue Elemente verfuegbar: 7
neue Elemente verfuegbar: 6
neue Elemente verfuegbar: 5
neue Elemente verfuegbar: 4
neue Elemente verfuegbar: 3
neue Elemente verfuegbar: 2
neue Elemente verfuegbar: 1
neue Elemente verfuegbar: 0
Für Element nummer 65 musste capacity auf 128 (2 hoch 7) erhoeht werden, denn vergeben 64/64 Elemente
neue Elemente verfuegbar: 63
neue Elemente verfuegbar: 62
neue Elemente verfuegbar: 61
neue Elemente verfuegbar: 60
neue Elemente verfuegbar: 59
neue Elemente verfuegbar: 58
neue Elemente verfuegbar: 57
neue Elemente verfuegbar: 56
neue Elemente verfuegbar: 55
neue Elemente verfuegbar: 54
neue Elemente verfuegbar: 53
neue Elemente verfuegbar: 52
neue Elemente verfuegbar: 51
neue Elemente verfuegbar: 50
neue Elemente verfuegbar: 49
neue Elemente verfuegbar: 48
neue Elemente verfuegbar: 47
neue Elemente verfuegbar: 46
neue Elemente verfuegbar: 45
neue Elemente verfuegbar: 44
neue Elemente verfuegbar: 43
neue Elemente verfuegbar: 42
neue Elemente verfuegbar: 41
neue Elemente verfuegbar: 40
neue Elemente verfuegbar: 39
neue Elemente verfuegbar: 38
neue Elemente verfuegbar: 37
neue Elemente verfuegbar: 36
neue Elemente verfuegbar: 35
neue Elemente verfuegbar: 34
neue Elemente verfuegbar: 33
neue Elemente verfuegbar: 32
neue Elemente verfuegbar: 31
neue Elemente verfuegbar: 30
neue Elemente verfuegbar: 29
size: 100
capacity: 128
es wurde insgesamt 8 Mal der Speicher für myvector erhöht

aus.

Ersichtlich wird also, dass std::vector

myvector.capacity()

in 2-er-Potenzen erhöht, und zwar immer dann, wenn die aktuell noch verfügbare Anzahl an Elementen im vector 0 ist.

myvector.capacity()

gibt hierbei immer die Anzahl der Elemente an, die aktuell maximal in den allozierten Speicherbereich (ergo dem Vektor) geschrieben werden können, ohne dass Vector ein nächstgrößeres Array mit i + 1 der Größe repräsentiert als Summe einer Reihe





im Speicher reservieren muss und dann die Daten ins neue Array kopiert.

Dadurch wird wieder Platz für



neue Elemente im Vektor.

Dynamisch alloziertes Array

Ein dynamisch alloziertes Array ist ein Array, dessen Größe zur Laufzeit festgelegt wird. Da seine Größe zur Laufzeit bestimmt wird, kann es flexibler sein als ein Array mit fester Größe (das im Stack-Speicher alloziert wird).

Ein Beispiel:

int* dynArray;
int size = 10; // kann zur Laufzeit festgelegt werden
dynArray = new int[size];
//... Arbeit mit dynArray ...
delete[] dynArray;