2009-04-16 8 views
7

Sto imparando a programmare e il C++ è la mia prima lingua. Non preoccuparti di usare i puntatori per mostrarmi - non li capisco ancora, e non mi preoccuperò finché non avrò più tempo libero da dedicare a questo.È possibile ridimensionare un array C++ dopo l'inizializzazione?

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

mi è stato assegnato (non sto prendendo lezioni - solo l'apprendimento con alcuni amici mi hanno aiutato) un algoritmo di ordinamento merge, con l'algoritmo ha spiegato, ma non l'implementazione. Voglio riscrivere questo in modo che funzioni sia per numeri dispari che per interi. Ho provato aggiungendo questo codice:

if ((n % 2) != 0) int farray[halfelements + 1]; 

modo da poter utilizzare lo stesso numero intero per scorrere entrambi gli array successive. Una sizeof (farray) mostra di essere 16 byte o 4 numeri interi. Quindi non sta ridimensionando. Quello che voglio sapere - è possibile ridimensionare gli array dopo l'inizializzazione?

Modifica: come implementare un vettore? Non capisco come usare gli iteratori in un ciclo per scorrere e copiare i valori.

risposta

16

Gli array C++ sono di dimensioni fisse.

Se è necessario un "array ridimensionabile", è consigliabile utilizzare std::vector anziché un array.

+0

OK, grazie. Ho capito come implementare std :: vector in questo algoritmo.Anche se mi piacerebbe non aver passato due ore a eseguire il debug del mio codice, solo per capire l'intestazione della funzione "int mergeSort (std :: vector, int)" mancava un "" =/ – jkeys

+0

Non sono supportati da 'vector' dagli array dinamici comunque? Il ridimensionamento dinamico di un array o di un vettore dovrebbe comportare le stesse penalizzazioni prestazionali a destra> – Jason

1

Se si desidera ridimensionare un array, probabilmente si desidera utilizzare un vettore, che può essere ridimensionato automaticamente.

4

Il mio consiglio è ancora più forte: usare std::vector<> (ecc.) A meno che non si abbia una buona ragione per usare un array in stile C. Dato che stai imparando C++, dubito che tu abbia una tale ragione: usa std::vector<>.

+0

Dato che un vettore è garantito per l'archiviazione continua, anche passando a un metodo che prende il puntatore è possibile utilizzare un vettore. Solo quando si passa un riferimento/puntatore a un puntatore per un metodo per ridimensionare i dati si è bloccati con l'utilizzo di memoria non elaborata. – Richard

1

È possibile utilizzare l'operatore [] con un vettore nello stesso modo in cui si farebbe in un array. Si potrebbe implementare questo con un qualcosa di vettore come questo (se si volesse utilizzare più metodi vettoriali):

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

È inoltre possibile utilizzare .at (indice) per aggiungere controllo dei limiti all'accesso vettoriale.

+0

per favore non usare il codice HTML "pre" per il codice - invece, selezionare il codice con il mouse e digitare ctrl-K o fare clic sull'icona del codice –

+0

Dovrebbe usare i costruttori vector (iter, iter). vector farray (originalarray.begin(), & originalarray [half]), sarray (& originalarray [half], originalarray.end()); In seguito elimina la copia. Ma probabilmente è confusionario. – jmucchiello

0

Se volete sapere il motivo per cui la vostra prima idea compilato, ma non sembra funzionare:

Quando si omette le parentesi in un'istruzione if-:

if ((n % 2) != 0) int farray[halfelements + 1]; 

è proprio lo stesso come se si 'd li usavano:

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

Così sta facendo un 'Farray' del formato corretto - e poi va subito fuori portata e è andato, e si è lasciato con solo quella originale.

2

Vorrei anche raccomandare std::vector. Tuttavia, se si è bloccati con un array, è sempre possibile la memoria malloc e quindi realloc se è necessario ingrandire l'array.

Fare una ricerca qui su SO, ci sono informazioni su malloc e realloc.

+0

Anch'io uso questa convenzione. – Hydro