So erstellen Sie ein dynamisches Array von Ganzzahlen in C++ mit der new
Stichwort?
So erstellen Sie ein dynamisches Array von Ganzzahlen
Sudantha
int main()
{
int size;
std::cin >> size;
int *array = new int[size];
delete [] array;
return 0;
}
Vergiss es nicht delete
jedes Array, mit dem Sie zuweisen new
.
-
8 Jahre später könnte dieser Kommentar Anfänger @GManNickG verwirren, wie wäre es mit dem Löschen (da ich annehme, dass er gemacht wurde, bevor Jason Iverson das Array tatsächlich gelöscht hat)?
– Gsamaras
6. Oktober 2018 um 15:00 Uhr
-
@gsamaras: Ich stimme zu, dass es verwirrend ist, aber es ist immer noch richtig: Ihr Code sollte keine manuelle Löschung haben, die Sie nicht vergessen müssen. Das heißt, verwendete Smart Pointer und andere Container.
– GManNickG
6. Oktober 2018 um 16:40 Uhr
-
@GManNickG Ich denke, Ihr Kommentar könnte weniger dogmatisch sein. Der Code ist korrekt, auch wenn er nicht ideal ist. Smart Pointer und Container sind fast immer eine bessere Option (insbesondere in einer Anfängerfrage wie dieser), aber nicht “immer” immer.
– Spencer
10. April 2020 um 16:03 Uhr
-
Ich stimme @Spencer zu, der Code ist nicht falsch, es ist einfach, perfektes C++. Sie können davon ausgehen, dass es eine Alternative gibt, es als Best Practices bezeichnen usw. Aber an diesem Beispiel an sich ist nichts auszusetzen.
– Arman
3. Dezember 2020 um 9:15 Uhr
Ben Voigt
Seit C++11 gibt es eine sichere Alternative zu new[]
und delete[]
was im Gegensatz zu Null-Overhead ist std::vector
:
std::unique_ptr<int[]> array(new int[size]);
In C++14:
auto array = std::make_unique<int[]>(size);
Beides stützt sich auf die gleiche Header-Datei, #include <memory>
-
Ich weiß nicht, ob es nur an mir liegt, aber diese C++11-Syntax sieht schrecklich aus. Das C++14 sieht viel besser aus. Andererseits habe ich seit Pre-C++ 11 nicht mehr mitgehalten. Es ist schwer, sich an all diese neuen Ausdrücke zu erinnern.
– Keya Kersting
9. April 2020 um 20:59 Uhr
jveazey
Vielleicht möchten Sie die Verwendung der Standard-Vorlagenbibliothek in Betracht ziehen. Es ist einfach und leicht zu bedienen, und Sie müssen sich keine Gedanken über Speicherzuweisungen machen.
http://www.cplusplus.com/reference/stl/vector/vector/
int size = 5; // declare the size of the vector
vector<int> myvector(size, 0); // create a vector to hold "size" int's
// all initialized to zero
myvector[0] = 1234; // assign values like a c++ array
-
@Ed, die Einschränkung in der Frage scheint eher willkürlich zu sein.
std::vector
mit dem entsprechenden Konstruktor funktioniert wirklich gut und sollte als Alternative aufgezeigt werden. Manchmal stellen die Leute die Frage schlecht, und dies könnte als einer dieser Fälle gelten – es ist sehr kurz und gibt keinen Grund dafür, es vorzuziehennew
.– Markieren Sie Lösegeld
27. Oktober 2010 um 4:23 Uhr
-
@Ed: Es gibt keinen Grund zu verwenden
new[]
anstattstd::vector
.– GManNickG
27. Oktober 2010 um 4:33 Uhr
-
@baash: In C++ gibt es nie einen Grund. Wenn Sie sich, aus welchem Grund auch immer, entscheiden, „die Standardbibliothek zu entfernen“, programmieren Sie nicht mehr in C++. Mein Kommentar bezieht sich auf die C++-Sprache, nicht auf die C++-Sprache, die wir auf meinem Gerät verwenden. Trotzdem sollten Sie das nicht müssen
delete
alles manuell, überhaupt. Ebenfalls,std::vector
ist ein dynamisches Array und macht nichts mit einer verknüpften Liste. Es ist nur ein Wrapper um einen Teil des Speichers.– GManNickG
27. Oktober 2010 um 5:01 Uhr
-
@Montdidier: Nein. Sie verwenden immer noch
new
unddelete
Wrapper zu implementieren. Der Punkt ist, dass Sie keine Ressource verwalten und benutze es, du machst das eine oder das andere.– GManNickG
27. Oktober 2010 um 5:50 Uhr
-
@Montdidier: Beginnen wir mit den Behauptungen: In C++ werden alle Instanzen von
new[]
kann ersetzt werden durchstd::vector
. Und weilstd::vector
Ressourcenmanagement korrekt von der Ressourcennutzung (SBRM) trennt, sollten wir dies tun.– GManNickG
27. Oktober 2010 um 6:35 Uhr
int* array = new int[size];
Sobald es um dynamische Arrays geht, möchten Sie möglicherweise nicht nur Arrays mit variabler Größe erstellen, sondern auch deren Größe während der Laufzeit ändern. Hier ein Beispiel mit memcpy
können Sie verwenden memcpy_s
oder std::copy
auch. Je nach Compiler, <memory.h>
oder <string.h>
wird vielleicht benötigt. Bei Verwendung dieser Funktionen weisen Sie einen neuen Speicherbereich zu, kopieren Werte von ursprünglichen Speicherbereichen dorthin und geben sie dann frei.
// create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];
// now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];
/*
somehow set values to given arrays
*/
// add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;
Sie können stattdessen die Konstante 4 verwenden sizeof(int)
.
SCBürgel
Weisen Sie dynamisch etwas Speicher zu new
:
int* array = new int[SIZE];
Die obigen Antworten sind alle gut für die Zuweisung eindimensionaler Int-Arrays. Wie auch immer, ich möchte hinzufügen, dass dies auch für mehrdimensionale Arrays möglich ist, die Sie normalerweise so definieren würden int[][] matrix = {{1,2}, {3,4}}
.
Der Schlüssel ist, dass Sie alle Elemente dynamisch in einem Array speichern und die Tatsache nutzen, dass das Array ein kontinuierlicher Block im Speicher ist (siehe hier für eine Erläuterung von “Block”), was bedeutet, dass Sie sich selbst durch Dimensionen “schneiden” können. Unten sehen Sie ein Beispiel für ein 2d-Array.
Eine Diskussion zu diesem Thema finden Sie hier auf SO.
/*Defining a 2d-matrix.*/
struct Matrix {
int rows, columns;
int* matrix;
Matrix(int rows, int columns) : rows(rows), columns(columns) {
// Keep in mind that arrays cannot be generated during runtime
// since the compiler needs to know the size to allocate in memory.
// Thus, use dynamic memory and keep in mind to delete it!
// This only uses a single array since "new" cannot create
// multidimensional arrays by default. Thus, everything is
// written in a single memory-block and accessed via getElement().
matrix = new int[columns * rows];
}
~Matrix() {
// Release the memory after destroying the Matrix-object
delete matrix;
}
/*Access the element at position [r]ow and [c]olumn.*/
int getElement(int r, int c) {
// matrix[c][r] is rewritten as matrix[column + columns * rows]
// -> matrix <=> Single memory block
return matrix[c + columns * r];
}
/*Set the element at position [r]ow and [c]olumn with given [val]ue.*/
void setElement(int r, int c, int val) {
matrix[c + columns * r] = val;
}
};
Ein Beispiel zum Befüllen einer solchen Matrix
-Objekt wäre:
/*Initialize the matrix with the continuous numbers 0..N*/
void Matrix::initDummyMatrix(){
int counter = 0;
for (int row = 0; row < rows; ++row) {
for (int col = 0; col < columns; ++col) {
setElement(row, col, counter++);
}
}
}
Sie verwenden ein
std::vector<int>
. Und ein Buch.– GManNickG
27. Oktober 2010 um 4:32 Uhr
Wie weisen Sie seine Daten zu und wie greifen Sie darauf zu, sobald er initialisiert ist?
– Benutzer1073395
30. November 2011 um 13:05 Uhr
Schauen Sie sich diesen Beitrag an, hier ist er im Detail für jede Art von Datentypen angegeben: Programmingtunes.com/dynamic-array-in-c
– Benutzer2808359
25. Juli 2014 um 12:44 Uhr
cs.nmsu.edu/~rth/cs/cs471/C%2B%2BDynamicArray.pdf
– Nagappa
4. Juni 2020 um 9:40 Uhr
quora.com/Was-ist-die-Bedeutung-von-%E2%80%9Cint-*p-new-10-%E2%80%9D#:~:text=Die%20Anweisung%20definiert%20und%20initialisiert%20ein%20Array%20von%20Ganzzahlen.&text=Diese%20Anweisung%20wird%20dynamisch%20zugewiesen ,Ganzzahlen%20aus%20dem%20Haufen…
– Nagappa
4. Juni 2020 um 9:42 Uhr