Newsgroup: it.comp.lang.c++
Titolo: new e array

ciao a tutti ho un problemino, per cambiare la dimensione di un array con
"new" come si fa?
????  a[10]-------new-------->a[15]   ????


Si fa che se usassi i vector di interi non hai questi problemi.
Guardati std::vector dopo aver incluso <vector>
Ciao
Maurus


non ho provato il codice ma sono abbastanza sicuro (Assumo che l'array sia
di int, tanto e' uguale)
int *prev = a;
a = new int[15];
for(unsigned int i = 0; i < 10; ++i) {
    a[i] = prev[i];
}
delete prev;
ciao e buon lavoro,
Nids

 ha scritto nel messaggio
news:b2e85e$1c5pfm$1...@ID-125555.news.dfncis.de...

Non sempre i vector sono efficienti come gli array.
Ciao,
Nids


Mi fai un esempio dove sia preferibile usare un array invece che un vector?
Maurus

 ha scritto nel messaggio
news:b2ea20$1bagnr$1...@ID-125555.news.dfncis.de...

Possono essere piu' efficienti in un contesto di contenitore non ordinato.
Nel caso si elimini un elemento dal centro del vector questo viene
ricompattato spostando tutti gli elementi di un posto ( O(n) )
Nel caso si elimini un elemento dal centro dell'array ci si puo' limitare a
copiarvici l'elemento in coda e segnare quest'ultimo coma vuoto ( O(1) )
I contenitori standard hanno comportamenti standard mediamente efficienti, i
contenitori ad hoc in contesti ad alte performance sono da preferirsi
senza contare che il vector contiene informazioni aggiuntive tipo size e
maxsize che non sono, sempre, necessarie in un array e poi gli oggetti hanno
le v-tables che occupano memoria anche per i metodi che non si useranno mai.
ciao,
Nids
ps: in un contesto normale e' sempre meglio usare i contenitori standard e
semplificarsi la vita (soprattutto quando si va a riallocare)
pps: sempre riguardo i contesti ad alte performance si preferiscono i vecchi
char * alle string

 Maurus

 Nids
  Ciao!



Ti hanno gia' risposto usando il C++ e il new (in pratica
ti hanno detto che devi riallocare un nuovo array e
fare una copia).
Una alternativa (non me ne vogliano i C++-isti puri), se stai
usando spesso array che devono cambiare di tanto in tanto
dimensione e' usare la realloc,
se l'array e' stato inizialmente allocato dinamicamente
(con malloc, calloc o realloc) o e' NULL,
allora puoi fare semplicemente qualcosa del tipo
a=realloc(a,15*sizeof("tipo di a"));
che dovrebbe ricopiarti i contenuti vecchi se necessario o
"allungarti" il vettore se possibile (casomai controlla come
e' definita sul tuo sistema). Sul mio:
void *realloc(void *ptr, size_t size)
realloc()  changes the size of the memory block pointed to by ptr to
size bytes. *The contents will be unchanged to the  minimum of  the
old and new sizes;* newly allocated memory will be uninitialized.  If
ptr is NULL, the call is equivalent  to  malloc(size);  if  size  is
equal  to  zero, the call is equivalent to free(ptr).  Unless ptr is
NULL, it must have been returned by an  earlier  call  to  malloc(),
calloc() or realloc().
ciao,
g.

 le v-tables che occupano memoria anche per i metodi che non si useranno mai.
Vero per le informazioni aggiuntive, doppiamente falso per la vtable:
intanto la vtable e' unica per classe e non specifica per oggetto,
quello che hanno gli oggetti polimorfici e' il vptr, ovvero il
puntatore alla vtable; in ogni caso vector non ce l'ha perche' non ha
funzioni membro virtuali.
Ciao,
Nicola

 e' definita sul tuo sistema). 
Questo ovviamente dando per scontato che si tratti di array di tipi
nativi o di tipi POD senza costruttore, altrimenti realloc fa solo
pasticci.
Ciao,
Nicola