So erstellen Sie ein dynamisches Array von Ganzzahlen

82

Wie erstelle ich ein dynamisches Array von Ganzzahlen in C ++ mit dem newSchlüsselwort?

Sudantha
quelle
11
Sie verwenden eine std::vector<int>. Und ein Buch .
GManNickG
Wie können Sie die Daten nach der Initialisierung zuweisen und darauf zugreifen?
Werfen Sie einen Blick auf diesen Beitrag, hier wird er detailliert für alle Arten von Datentypen angegeben: programmingtunes.com/dynamic-array-in-c
user2808359
quora.com/Was-ist-die-bedeutung-von-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text = Die% 20-Anweisung% 20 definiert% 20 und% 20initialisiert, von% 20an% 20array% 20of% 20integers. & text = Diese% 20Statement% 20will% 20dynamically% 20allocate, integers% 20from% 20the% 20heap ...
Nagappa

Antworten:

121
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

Vergessen Sie nicht deletejedes Array, das Sie zuweisen new.

Jason Iverson
quelle
26
Ich werde nicht -1, aber wenn Sie es möglicherweise sogar vergessen können, deleteist Ihr Code falsch.
GManNickG
2
8 Jahre später könnte dieser Kommentar Anfänger @GManNickG verwirren. Wie wäre es, ihn zu löschen (da er vermutlich erstellt wurde, bevor Jason Iverson das Array tatsächlich gelöscht hat)?
Gsamaras
2
@gsamaras: Ich stimme zu, es ist verwirrend, aber es ist immer noch richtig: Ihr Code sollte keine manuelle Löschung haben, an die Sie denken müssen, um nicht zu vergessen. Das heißt, verwendete intelligente Zeiger und andere Container.
GManNickG
@GManNickG Ich denke, Ihr Kommentar könnte weniger dogmatisch sein. Der Code ist korrekt, auch wenn er nicht ideal ist. Intelligente Zeiger und Container sind fast immer eine bessere Option (insbesondere bei einer Anfängerfrage wie dieser), aber nicht immer "immer".
Spencer
62

Seit C ++ 11 gibt es eine sichere Alternative zu new[]und ohne delete[]Overhead std::vector:

std::unique_ptr<int[]> array(new int[size]);

In C ++ 14:

auto array = std::make_unique<int[]>(size);

Beide oben genannten basieren auf derselben Header-Datei. #include <memory>

Ben Voigt
quelle
Ich weiß nicht, ob es nur ich ist, aber diese C ++ 11-Syntax sieht schrecklich aus. Das C ++ 14 sieht viel besser aus. Andererseits habe ich seit vor C ++ 11 nicht mehr Schritt gehalten. Es ist schwer, sich an all diese neuen Ausdrücke zu erinnern.
Keya Kersting
28

Möglicherweise möchten Sie die Standardvorlagenbibliothek verwenden. Es ist einfach und benutzerfreundlich und Sie müssen sich keine Gedanken über die Speicherzuweisung 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
jveazey
quelle
17
Ok, aber die eigentliche Frage zu beantworten ist auch schön.
Ed S.
8
@Ed, die Einschränkung in der Frage scheint eher willkürlich. std::vectormit dem entsprechenden Konstruktor funktioniert wirklich gut und sollte als Alternative hervorgehoben werden. Manchmal stellen die Leute die Frage schlecht, und dies kann als einer dieser Fälle gelten - es ist sehr kurz und gibt keinen Grund, es zu bevorzugen new.
Mark Ransom
3
@Ed: Es gibt keinen Grund, new[]stattdessen zu verwenden std::vector.
GManNickG
2
@baash: In C ++ gibt es nie einen Grund. Wenn Sie aus irgendeinem Grund 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 deleteniemals etwas manuell benötigen . Ist auch std::vectorein dynamisches Array und macht nichts mit einer verknüpften Liste. Es ist nur eine Hülle um einen Teil der Erinnerung.
GManNickG
1
@Montdidier: Nein. Sie verwenden newund deleteimplementieren immer noch Wrapper. Der Punkt ist, dass Sie eine Ressource nicht verwalten und verwenden, sondern das eine oder andere tun.
GManNickG
5
int* array = new int[size];
Ed S.
quelle
1
Es beantwortet nur die Frage.
Ed S.
@GManNickG Weil Vektor bequemer sein kann oder aus anderen Gründen? Weil ich häufig auf Funktionen von Drittanbietern stoße, die die Verwendung von Arrays anstelle von Vektoren erfordern.
Lèse Majesté
5
@ Lèsemajesté Das ist kein Grund, keine Vektoren zu verwenden - Die std::vector::data()Member-Funktion gibt das zugrunde liegende Raw-Array zurück, wenn dies erforderlich ist.
Emlai
3
@zenith: Normalerweise würden Sie operator&eher verwenden, als data()einen Zeiger von einem Vektor abzurufen , aber es stimmt, dass ein Vektor die Kontiguitätsgarantie bietet, die für die Kompatibilität mit Funktionen erforderlich ist, die Arrays erwarten.
Ben Voigt
3

Sobald es um dynamisches Array geht, möchten Sie möglicherweise nicht nur ein Array mit variabler Größe erstellen, sondern auch dessen Größe zur Laufzeit ändern. Hier ist ein Beispiel mit memcpy, das Sie verwenden können memcpy_soder std::copyauch. Abhängig vom Compiler <memory.h>oder <string.h>möglicherweise erforderlich. Wenn Sie diese Funktionen verwenden, weisen Sie einen neuen Speicherbereich zu, kopieren die Werte der ursprünglichen Speicherbereiche 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 Konstante 4 verwenden sizeof(int).

Carimus
quelle
1

Ordnen Sie dynamisch Speicher zu, indem Sie new:

int* array = new int[SIZE];
Montdidier
quelle
2
Wahrscheinlich fehlt Ihnen der Doppelpunkt oder Sie haben SIZE nicht durch eine tatsächliche Größe ersetzt.
Montdidier
5
Warum sollte es ein Semikolon geben? Es ist keine vollständige Aussage. Es könnte mehr Erklärungen geben. Wenn dies in einem vollständigen Programm enthalten ist, entspricht dies den Anforderungen des OP.
Benjamin Lindley
0
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

Der obige Code funktioniert, die maximale Float- oder Int-Array-Größe, die definiert werden konnte, war mit der Größe 2095879, und die Exit-Bedingung wäre nicht Null, beginnend mit der Eingangsnummer

shawndfernandes
quelle