Pagina 1 di 1

ancora c++...inizializzare vector

Inviato: gio 29 nov 2007, 17:56
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!!

Inviato: gio 29 nov 2007, 18:26
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;
}
?

Inviato: gio 29 nov 2007, 18:34
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!!!

Inviato: gio 29 nov 2007, 18:42
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.

Inviato: gio 29 nov 2007, 18:53
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

Inviato: gio 29 nov 2007, 18:55
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.

Inviato: gio 29 nov 2007, 19:15
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

Inviato: gio 29 nov 2007, 19:39
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.