Come creare una matrice dinamica di numeri interi


85

Come creare un array dinamico di numeri interi in C ++ utilizzando la newparola chiave?


12
Usi un file std::vector<int>. E un libro .
GManNickG

come si assegna e si accede ai suoi dati una volta inizializzati?

Dai un'occhiata a questo post, qui viene fornito in dettaglio per ogni tipo di dato: programmingtunes.com/dynamic-array-in-c
user2808359


quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text = L'istruzione% 20% 20defines% 20e% 20inizializza, di% 20an% 20array% 20of% 20 interi. & text = Questa% 20statement% 20will% 20dynamically% 20allocherà, interi% 20from% 20the% 20heap ...
Nagappa

Risposte:


129
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

Non dimenticare di deleteogni array con cui assegni new.


28
Non voglio -1, ma se puoi anche dimenticartene delete, il tuo codice è sbagliato.
GManNickG

2
8 anni dopo quel commento potrebbe confondere i principianti @GManNickG, che ne dici di eliminarlo (dato che suppongo sia stato creato prima che Jason Iverson cancellasse effettivamente l'array)?
gsamaras

2
@gsamaras: Sono d'accordo che sia fonte di confusione ma è ancora corretto: il tuo codice non dovrebbe avere la cancellazione manuale che devi ricordare per non dimenticare. Cioè, puntatori intelligenti usati e altri contenitori.
GManNickG

1
@GManNickG Penso che il tuo commento potrebbe essere meno dogmatico. Il codice è corretto, anche se non è l'ideale. Puntatori e contenitori intelligenti sono quasi sempre un'opzione migliore (specialmente in una domanda per principianti come questa) ma non "sempre" sempre.
Spencer

Sono d'accordo con @Spencer, il codice non è sbagliato, è semplice, perfetto c ++. Potresti sottolineare che esiste un'alternativa, chiamarla best practice, ecc. Ma non c'è niente di sbagliato in questo esempio in sé.
Arman

67

A partire da C ++ 11, esiste un'alternativa sicura a new[]e delete[]che è zero overhead a differenza di std::vector:

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

In C ++ 14:

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

Entrambi i precedenti si basano sullo stesso file di intestazione, #include <memory>


Non so se sono solo io, ma quella sintassi C ++ 11 sembra terribile. Il C ++ 14 ha un aspetto decisamente migliore. Poi di nuovo non ho tenuto il passo da prima di C ++ 11. Ricordare tutte queste nuove espressioni è difficile.
Keya Kersting

31

Potresti prendere in considerazione l'utilizzo della libreria di modelli standard. È semplice e facile da usare, inoltre non devi preoccuparti delle allocazioni di memoria.

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

8
@Ed, la restrizione nella domanda sembra piuttosto arbitraria. std::vectorcon il costruttore appropriato funziona davvero bene e dovrebbe essere indicato come alternativa. A volte le persone fanno la domanda male e questo potrebbe contare come uno di quei casi: è molto breve e non fornisce alcuna motivazione per la preferenza new.
Mark Ransom

3
@Ed: non c'è motivo di usare al new[]posto di std::vector.
GManNickG

2
@baash: in C ++, non c'è mai un motivo. Se decidi, per qualsiasi motivo, di "rimuovere la libreria standard", non stai più programmando in C ++. Il mio commento riguarda il linguaggio C ++, non il C ++ - language-we-use-on-my-device. Anche così, non dovresti aver bisogno di deletenulla manualmente, mai. Inoltre, std::vectorè un array dinamico e non fa nulla con un elenco collegato. È solo un involucro attorno a un pezzo di memoria.
GManNickG

1
@ Montdidier: No. Utilizzi ancora newe deleteper implementare i wrapper. Il punto è che non gestisci una risorsa e la usi, fai l'una o l'altra.
GManNickG

1
@Montdidier: iniziamo con le affermazioni: in C ++, tutte le istanze di new[]possono essere sostituite con std::vector. E poiché std::vectorsepara correttamente la gestione delle risorse dall'utilizzo delle risorse (SBRM), dovremmo farlo.
GManNickG

6
int* array = new int[size];

2
Risponde solo alla domanda.
Ed S.

@GManNickG Perché il vettore può essere più conveniente o per altri motivi? Perché spesso incontro funzioni di terze parti che richiedono l'uso di array invece di vettori.
Lèse majesté

5
@ Lèsemajesté Non è un motivo per non utilizzare i vettori: la std::vector::data()funzione membro restituirà l'array grezzo sottostante quando necessario.
emlai

3
@zenith: in genere, useresti operator&piuttosto che data()ottenere un puntatore da un vettore, ma è vero che un vettore fornisce la garanzia di contiguità necessaria per la compatibilità con le funzioni che si aspettano matrici.
Ben Voigt

3

Non appena la domanda riguarda un array dinamico, potresti non solo creare un array con dimensioni variabili, ma anche modificarne le dimensioni durante il runtime. Ecco un esempio con memcpy, puoi usare anche memcpy_so std::copy. A seconda del compilatore, <memory.h>o <string.h>potrebbe essere richiesto. Quando si utilizza questa funzione, si alloca una nuova regione di memoria, si copiano i valori delle regioni di memoria originali e quindi si rilasciano.

//    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;

Puoi usare la costante 4 invece di sizeof(int).


1

alloca dinamicamente un po 'di memoria utilizzando new:

int* array = new int[SIZE];

2
Probabilmente ti mancano i due punti o non hai sostituito SIZE con una dimensione effettiva .
Montdidier

5
Perché dovrebbe esserci un punto e virgola? Non è una dichiarazione completa. Potrebbero esserci più dichiarazioni. Questo, se incluso in un programma completo, fa ciò che l'OP ha chiesto.
Benjamin Lindley,

-1
#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;
}

Il codice sopra funziona, la dimensione massima dell'array float o int che potrebbe essere definita era con dimensione 2095879 e la condizione di uscita sarebbe stata un numero di input iniziale diverso da zero


Questo non ha nulla a che fare con una domanda su un array dinamico.
Ben Voigt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.