C++ Vector erst erstellen wenn Bedingung erfüllt ist?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

ist es möglich ein std::vector erst im Programmablauf durch eine Bedingung global zu definieren?
Global soll es sein weil verschiedenste Funktionen damit arbeiten sollen und der maximale Speicher zur Verfügung stehen soll.
Idee dahinter, man spart den Speicher wenn Bedingung im Programmablauf nicht erfüllt wird.

Bisher hab ich einfach das Vektorfeld global angelegt ohne Angabe der Feldanzahl und dann wenn die Bedingung erfüllt war per resize dem Vector die Größe gegeben. Die Frage wäre ob es eine schickere Methode gibt bei der der Vector bei nicht Benutzung erst gar nicht angelegt wird. Oder ist das Anlegen ohne Feldgröße was den Speicher angeht sowieso egal?

Grüße
 
Oder ist das Anlegen ohne Feldgröße was den Speicher angeht sowieso egal?
Ist es, der hat dann Größe 0 und braucht nur ein paar Bytes. Aber poste doch bitte mal Code, ich habe gerade keine Vorstellung, was du vorhast - nur, dass deine Idee wahrscheinlich eine sehr, sehr schlechte ist.
 
Bisher hab ich es vom Prinzip so gemacht:

Code:
std::vector<double> var;

int main()
{
   if(bedingung==true)
   {
      var.resize(999999);
   }
}
 
Wieso nicht einfach ein Pointer anlegen (und mit nullptr oder NULL initialisieren) und dann mit "new" ein vector-objekt erstellen?
 
Zuletzt bearbeitet:
Warum soll dein Vektor denn eine festgelegte Groesse haben? Wenn du nur konditional resizen moechtest, wuerde ich mir erstmal ueberlegen, ob ich etwaige resize-Operationen nicht einfach dem Vector-Objekt ueberlasse, die automatische Resize-Eigenschaft draengt sich dann naemlich geradezu auf. Die Frage waere also, ob du den Performancegewinn tatsaechlich brauchst.
Du musst dann aufpassen, die Groesse deines Vectors immer gut zu kennen, weil diese Praxis recht fehleranfaellig dafuer ist, dass du z.B. glaubst, einen Vektor der Groesse 1000 zu haben, er aber nur 10 Elemente hat. Das muss nicht zwangslaeufig crashen, duerfte aber zumindest unangenehm zu debuggen sein - haengt zugegebenermassen auch vom Rest deines Codes ab.

Da du in deinem Beispiel var konditional initialisierst, koenntest du es auch so schreiben:
Code:
var = std::vector<double>(999999);

Wobei ich da gar nicht so sicher bin, ob er da erst nen Vector macht und den danach dann nochmal in var kopiert, oder ob da nur einmal kopiert wird.

@Teiby: Wenn mit nem Pointer, dann in diesem Fall aber nen Smart-Pointer. (Hier glaube ich unique_ptr, weil die Ownership nicht geteilt und verschoben werden soll).
 
Zuletzt bearbeitet:
Erst während des Programmablaufs stellt sich heraus wie groß die Felder werden sollen daher wird es nicht direkt definiert. Wenn die Größe der Felder feststeht dann werden die Felder auch immer alle genutzt daher ist in diesem Fall die feste Fixierung der Feldgröße schon gewollt.

Ich dachte nur es gäbe eventuell ein Weg die Sache komplett von lokal aus zu machen. Aber wenn das anlegen ohne Feldgröße wie VikingGe schreibt wirklich nur ein paar Byte verbraucht dann war ich mit meiner rezise Methode ja gar nicht so verkehrt.

Die Pointersache muss ich mir näher angucken.

Danke schon mal
lg
 
Teiby schrieb:
Wieso nicht einfach ein Pointer anlegen (und mit nullptr oder NULL initialisieren) und dann mit "new" ein vector-objekt erstellen?

Was gewinnst du dadurch? Nix. Du handelst dir völlig unnötig einen zusätzlichen Pointer und eine unnötige dynamische Allokierung ein.
 
Zurück
Oben