Vektoren und reserve()



  • 314159265358979 schrieb:

    1. Die Größe kannst du bereits im Konstruktor übergeben:
    std::vector<T> v(30);
    

    Das ist aber was anderes, als mit reserve für eine bestimmte Anzahl von Vektorelementen vorauszuplanen.



  • HighLigerBiMBam schrieb:

    Meines Wissens ist nach dem Konstruieren capacity() == size(), allerdings weiss ich nicht ob das vom Standard her festgelegt ist.

    Definitiv nicht.

    Notice that, in vectors, the capacity is not necessarily equal to the number of elements that conform the underlying vector content (this can be obtained with member vector::size), but the capacity of the actual allocated space, which is either equal or greater than the content size.

    Und wo ist da jetzt das Argument, dass nach dem Konstruieren Ungleichheit gelten darf?



  • Michael E. schrieb:

    HighLigerBiMBam schrieb:

    Meines Wissens ist nach dem Konstruieren capacity() == size(), allerdings weiss ich nicht ob das vom Standard her festgelegt ist.

    Definitiv nicht.

    Notice that, in vectors, the capacity is not necessarily equal to the number of elements that conform the underlying vector content (this can be obtained with member vector::size), but the capacity of the actual allocated space, which is either equal or greater than the content size.

    Und wo ist da jetzt das Argument, dass nach dem Konstruieren Ungleichheit gelten darf?

    Ich denke, das "Definitiv nicht" bezog sich auf die Aussage bezüglich des Standards - nicht bezüglich des Verhaltens.



  • theta schrieb:

    Michael E. schrieb:

    HighLigerBiMBam schrieb:

    Meines Wissens ist nach dem Konstruieren capacity() == size(), allerdings weiss ich nicht ob das vom Standard her festgelegt ist.

    Definitiv nicht.

    Notice that, in vectors, the capacity is not necessarily equal to the number of elements that conform the underlying vector content (this can be obtained with member vector::size), but the capacity of the actual allocated space, which is either equal or greater than the content size.

    Und wo ist da jetzt das Argument, dass nach dem Konstruieren Ungleichheit gelten darf?

    Ich denke, das "Definitiv nicht" bezog sich auf die Aussage bezüglich des Standards - nicht bezüglich des Verhaltens.

    Das denke ich auch. Trotzdem sehe ich kein Argument.



  • Ja ich muss zugeben es war etwas wortkarg. Auch wenn sich vector nach dem konstruieren so verhalten sollte, wäre es gefährlich anzunehmen, dass capacity und size ein und das Selbe sind, bzw. man diese beliebig gegeneinander ersetzen könnte. Sicher können sie identisch sein, aber darauf würde ich mich nicht stützen.

    Ich glaube auch nicht, dass diese Gleichheit im Standard definiert ist/sein sollte. Wenn es so ist, wäre ein Link hier sehr nützlich.



  • Ich denke auch nicht, dass nach dem Konstruieren eines std::vector (egal mit welchem Konstruktor) size == capacity garantiert ist. Allerdings kann man das nicht daraus herleiten, dass diese beiden Größen im Allgemeinen unterschiedlich sein dürfen. Deshalb hat mich dein "definitiv nicht" etwas gestört.



  • Michael E. schrieb:

    Ich denke auch nicht, dass nach dem Konstruieren eines
    std::vector (egal mit welchem Konstruktor) size == capacity garantiert ist.
    Allerdings kann man das nicht daraus herleiten, dass diese beiden Größen im
    Allgemeinen unterschiedlich sein dürfen. Deshalb hat mich dein "definitiv nicht"
    etwas gestört.

    Meines wissens nach sind capacity und size prinzipiell
    unterschiedlich.
    Capacität:
    gibt die absolute anzahl der elemente an, die gespeichert werden können.
    Size:
    gibt die absolute anzahl der elemente an, die gespeichert worden sind.

    Jetzt die frage:

    Michael E schrieb:

    [...]kann man das nicht daraus herleiten, dass diese beiden Größen im Allgemeinen unterschiedlich sein dürfen.

    Mich würde arg wundern wenn diese nicht unterschiedlich wären.

    Der Grund (wie in einem post weiter vorne schon gesagt) ist eine reallocation mit overhead,
    damit nicht bei jedem push_back o.ä. ein realloc folgen muss, was performance
    einbüßen würde.

    grüüüße



  • Sie sind nicht prinzipiell unterschiedlich. Es kann sein, das diese gleich sind und zwar dann, wenn die Kapazität gleich der Anzahl der Element ist (also der Vector für das nächste Element reallozieren müsste).



  • Genau - und deshalb sind sie prinzipiell unterschiedlich. Nicht immer und nicht in jedem Fall, aber prinzipiell schon.

    Das hier:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main(void)
    {
    	vector<int> v;
    
    	for(int i = 0; i < 10; v.push_back(++i))
    		cout << "Kap.: " << v.capacity() << " Size: " << v.size() << '\n';
    }
    

    ergibt bei mir:

    Kap.: 0 Size: 0
    Kap.: 1 Size: 1
    Kap.: 2 Size: 2
    Kap.: 3 Size: 3
    Kap.: 4 Size: 4
    Kap.: 6 Size: 5
    Kap.: 6 Size: 6
    Kap.: 9 Size: 7
    Kap.: 9 Size: 8
    Kap.: 9 Size: 9
    

    mit VS 2008 auf WinXP SP3 32bit.



  • Nein sie sind nicht prinzipiell gleich oder unterschiedlich. Auch nicht, bei einer Beschränkung auf den Standard-Allokator.


Anmelden zum Antworten