new double[x] vs vector<double> (x), wobei der integer-x-Benutzer angegeben
Vermute, in einem code, den ich möchten, dass der Benutzer geben Sie eine ganze Zahl(sagen wir x) und dann zuweisen, die vielen aufeinander folgenden Zellen in der computer-Speicher, auf dem ich einige Art der Verarbeitung.
Meine Frage ist, ist es "besser" zu zuordnen, dieser Speicher als new double[x]
oder vector<double>(x)
.
Ich weiß, dass beide Methoden scheinen gut zu funktionieren ( d.h. kompiliert und ausgeführt wird, zumindest in diesem teeny wenig code)
int x; int* p;
cout<<"Enter integer x:";cin>>x;
vector<double> v(x);
p=new double[x]
Wenn Sie denken, die Antwort ist mit new
dann ist es möglich, irgendwie magisch konvertieren
der Speicher über new
in einen Vektor? Da Vektoren würde mir mehr power in der Manipulation der Daten.
InformationsquelleAutor smilingbuddha | 2011-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es besser
vector
Wann immer Sie können, weil der vielen Vorteile, die es bietet (automatische Speicherverwaltung, bounds checking, etc).Auch, um die Vektor-reserve eine Anzahl von Elementen für Sie zu verwenden (d.h. zuordnen, dass viele alles auf einmal im Speicher statt, der schließlich Größenänderung bis Sie, wie Sie Elemente hinzufügen), können Sie übergeben Sie die Anzahl der Vektor-Konstruktor:
Oder wenn Sie bereits erstellt haben, einen Vektor, die Verwendung
vector::resize
:Und Nein, es gibt keine Möglichkeit zu sagen, einen Vektor zu verwenden, Speicher Sie haben bereits reserviert, es sei denn, Sie verwenden eine benutzerdefinierte Zuweisung [R. Martinho Fernandes, Kommentare].
oh, vergessen 🙂 aktualisiert.
Danke Seth, Mark und R. Martinho für Eure Antworten!
InformationsquelleAutor Seth Carnegie
Als die andere erwähnt haben, es ist normalerweise immer besser, ein Vektor. Allerdings geben einen Kontrapunkt, hier werden einige der möglichen Situationen, wenn ein array könnte besser:
Wenn Sie ein array verwenden, ist es am besten weisen Sie ihn auf den Stapel, wenn möglich. Zum Beispiel...
Das erste Beispiel ist besser, denn der Speicher wird automatisch freigegeben werden, sobald Ihr code verlässt den block, der das array definiert ist. Allerdings können Sie nur reservieren auf dem stack, wenn Sie im Voraus wissen, die Größe des Arrays. Wenn die Größe kann sich zur Laufzeit ändern, müssen Sie allokieren auf dem heap, leider.
&vec[0]
. Aber es gibt einige Einschränkungen, so ist es in der Regel nicht gut, es sei denn, Sie wissen genau, wie die C-Funktion funktioniert."in der Regel immer besser"
BTW es ist erwähnenswert, dass
char my_array[x];
kann sehr wohl kompilieren, obwohl es in der UB. Ich habe gesehen, ein C++03-compiler nicht in der Lage zu erkennen, das Problem mit dem code wievoid foo(const int x) { char a[x]; } int main() { int x = 3; foo(3); }
in einigen Fällen (wenn ein C++11 compiler wird wahrscheinlich ablehnen alle nicht-constexpr
Dimensionen des Arrays).InformationsquelleAutor Chris Vig
Sollten Sie immer bevorzugen, Vektor über neue, denn es befreit Sie von sorgen über Speicher-management. Vektor verwendet neue, unter der Decke, sondern blendet die details von Ihnen.
Es gibt keinen Weg, um Vektor-verwenden Sie einen Puffer, Sie haben schon allocated mit new und es gibt wirklich keinen Grund, es zu versuchen.
InformationsquelleAutor Mark Ransom