2014-09-08 18 views
7

Es scheint, dass jedes Mal, wenn Sie ein neues Element an eine std::vector anhängen, wenn es keine leeren Elemente gibt, die Anzahl der zugewiesenen Elemente verdoppelt wird (zumindest in GCC 4.9). Ich denke, dies wird getan, um eine amortisierte konstante Zeitkomplexität zu erreichen.Std :: Vektor und Speicherzuweisung

zB nach diesen Code ausgeführt wird:

v.push_back (1); 
v.push_back (2); 
v.push_back (3); 
v.push_back (4); 
v.push_back (5); 

v.shrink_to_fit(); // capacity is 5 now 
v.push_back (6); 

std::cout << v.capacity() << std::endl; 

Der Ausgang ist 10.

In wenig Speicher-Systemen ist es eine Möglichkeit, dieses Verhalten zu verhindern, selbst wenn es auf Kosten einer Leistung Elfmeter?

Darüber hinaus wäre es möglich, anzugeben, dass es nur eine feste Anzahl von Elementen zuweisen sollte, anstatt es zu verdoppeln?

Ich weiß, ich kann anrufen std::vector::reserve() vor dem Hinzufügen neuer Elemente, aber es scheint ein Chaos in meinem Fall ... std::vector::shrink_to_fit() Aufruf ist ein anderer Ansatz, aber auch unbequem.

+0

Haben Sie tatsächlich die Kapazität nach dem Aufruf von 'shrink_to_fit' überprüft? – juanchopanza

+5

Um die Unordnung zu vermeiden (zu reduzieren), könnten Sie Ihre eigene freie Funktion schreiben, die einen Vektor und ein Element zum Hinzufügen nimmt und dann 'v.reserve (v.size() + 1)' gefolgt von einem 'push_back'. – dlf

+3

warum nicht Array in diesem Fall (wenn Sie feste Größe benötigen) – 4pie0

Antwort

5

Nein, es gibt keinen Weg.

Ihre einzige Möglichkeit ist es, Ihre eigene Vektordatenstruktur zu schreiben und damit können Sie machen, was Sie wollen (oder Sie können einfach eine Implementierung der Internet/C++ Bibliothek kopieren und ändern, was Sie brauchen und diesen neuen Vektor einfügen) in Ihrem Programm).

Eigentlich können Sie auch ein Array und den realloc Befehl verwenden.

+0

Wie benutzt man ein Array zusammen mit realloc? –