ancora c++...inizializzare vector

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

ancora c++...inizializzare vector

Messaggio da ccts2002 »

ciao a tutti!!!
ancora una curiosità sul c+...
se devo inzializzare un vector di double di cui conosco già i valori, come devo fare?

Codice: Seleziona tutto

vector<double> a(4);
in cui devo mettere valori casuali...tipo 1.3, 54534.9, etc, cioè non ordinati...
non ditemi con

Codice: Seleziona tutto

a[i]=...
perché sono molto più di 4...
in pratica cerco qualcosa del tipo...

Codice: Seleziona tutto

double a[]={2.4,43.24...}
ma utilizzando i vector...si può fare? sennò mi tocca utilizzare gli array tradizionali...

grazie e ciaoo!!

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

Qualcosa di simile:

Codice: Seleziona tutto

using std::auto_ptr;
using std::vector;

typedef int vec_t;

auto_ptr< vector<vec_t> > my_vector_new()
{
    vec_t a[] = { 42, 13, 24 };
    size_t sz = sizeof(a) / sizeof(vec_t);
    auto_ptr< vector<vec_t> > pt( new vector<vec_t>(a, a + sz) );

    return pt;
}
?

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Messaggio da ccts2002 »

grazie mille, soprattutto per la velocità!!!!
avevo trovato in google una soluzione simile, ma speravo ci fosse qualcosa di più immediato...perché se devo comunque passare per un array tradizionale, tanto vale che usi questi...penso che risolverò proprio cosi...

grazie mille!!!

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

Beh, se non hai necessità di modificarne la dimensione usa pure gli array.
In genere se ti trovi "costretto" ad usare realloc() allora significa che dovresti usare uno std::vector, almeno questa è la regola che seguo io.

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Messaggio da ccts2002 »

gallows ha scritto:Beh, se non hai necessità di modificarne la dimensione usa pure gli array.
In genere se ti trovi "costretto" ad usare realloc() allora significa che dovresti usare uno std::vector, almeno questa è la regola che seguo io.
grazie della dritta!!! 8)
sto cominciando a fare i primi passi nella programmazione ad oggetti con c++ e quindi mi vengono molti dubbi su quello che si può e non si può fare e come farlo!!!! :D :D :D

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

Mi è venuto in mente che puoi evitare gli array in questo modo:

Codice: Seleziona tutto

#include <cstdarg>

std::auto_ptr< vector<vec_t> > my_vector_new(int args, ...)
{
    va_list ap;
    va_start(ap, args);                                                                 

    auto_ptr< vector<vec_t> > pt( new vector<vec_t> );

    for (int i=0; i<args; i++)
        pt->push_back( va_arg(ap, vec_t) );

    va_end(ap);

    return pt;

}
La funzione prende un numero variabile di argomenti, il primo dice quanti valori inserire nel vector, gli altri sono appunto i valori. Es:

Codice: Seleziona tutto

std::vector<vec_t> v = * my_vector_new(3, 42, 13, 24);
Crea un vector contenente 42, 13 e 24.

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Messaggio da ccts2002 »

questo è molto interessante...
dato che siamo corregionali ti chiedo qualche cosa in più!!! :D :D :D
cos'è auto_ptr? penso di aver capito come funziona la funzione che hai creato...potrebbe essere utile...la terrò in memoria!!!!
per quello che mi interessava, penso che con gli array tradizionale il programma divento più snello...comunque è una funzione interessante...
l'unico dubbio grande è cosa è auto_ptr...ora cerco in internet...

grazie mille

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

auto_ptr è una classe template che distrugge l'oggetto allocato quando esce dallo scope, in pratica non ti devi preoccupare di dare "delete ptr" per evitare memory leak.

Rispondi