2010-09-20 30 views

risposta

28

La dimensione di un array è statica in C++. Non è possibile ridimensionarlo dinamicamente. Questo è quello che è per std::vector:

std::vector<int> v; // size of the vector starts at 0 

v.push_back(10); // v now has 1 element 
v.push_back(20); // v now has 2 elements 
v.push_back(30); // v now has 3 elements 

v.pop_back(); // removes the 30 and resizes v to 2 

v.resize(v.size() - 1); // resizes v to 1 
+9

Sostituire 'v.resize (v.size() - 1)' con 'v.pop_back()' ... – fredoverflow

+0

BTW, l'array in C# non è statico? – ironic

+4

@FredOverflow: Sì, questa è una possibilità. Tuttavia, ho cercato di attenermi al codice indicato nella domanda. Suppongo che 'size-1' sia solo un segnaposto. – sbi

1

Gli array RAW non sono ridimensionabili in C++.

Si deve usare qualcosa di simile a una classe Vector che fa permettere il ridimensionamento ..

std::vector consente di ridimensionare che oltre a permettere il ridimensionamento dinamico quando si aggiungono elementi (spesso rendendo il ridimensionamento manuale non necessaria per l'aggiunta).

27

Non è possibile ridimensionare l'array, è possibile solo assegnarne uno nuovo (con una dimensione maggiore) e copiare i contenuti del vecchio array. Se non si desidera utilizzare std::vector (per qualche motivo) Ecco il codice a esso:

int size = 10; 
int* arr = new int[size]; 

void resize() { 
    size_t newSize = size * 2; 
    int* newArr = new int[newSize]; 

    memcpy(newArr, arr, size * sizeof(int)); 

    size = newSize; 
    delete [] arr; 
    arr = newArr; 
} 

codice è da qui http://www.cplusplus.com/forum/general/11111/.

+13

E cosa succede quando tra 'new' e' delete' viene lanciata un'eccezione? '-1' _per suggerire la gestione manuale delle risorse a un newbie_. (Se vuoi renderlo sicuro, avrai bisogno di un puntatore intelligente. Se aggiungi qualche altra funzione di utilità, arriveresti a 'std :: vector'.) – sbi

+6

Grazie per -1 :) Sto suggerendo il newbie per capire che ** non avviene alcuna magia durante il ridimensionamento dell'array **, viene creato un nuovo array e tutti gli elementi vengono copiati e se si scrive un codice che ridimensiona l'array di 1 ogni volta che è necessario aggiungere un elemento aggiuntivo, si sprecherà risorse. –

+1

Se viene lanciata un'eccezione tra 'new' e' delete', significa che sei nei guai, e non puoi fare nulla nella funzione 'ridimensiona ', non dovresti trovare un'eccezione lì (forse solo per rilanciare un po' di più informativo) e lasciare che sia il chiamante a gestirlo. –

2
  1. Usa std::vector o
  2. Scrivi la tua metodo. Assegna un blocco di memoria usando new. con quella memoria puoi espandere fino al limite del frammento di memoria.
Problemi correlati