PDA

View Full Version : [C++] Inizializzare vector con 8 elementi


-Ivan-
31-08-2013, 11:11
Ho questa classe contenuta in un header:

typedef struct CubeCoords
{
Vector3D currentTraslation; //traslation of the cube in OBJECT SPACE
Vector3D currentRotation; //rotation of the cube in OBJECT SPACE

//vertexes
std::vector<Vector3D> verticesOBS; //vertices coords in OBJECT SPACE
std::vector<Vector3D> vertices; //vertices coords in WORLD SPACE
Vector3D center; //the center of the cube
};

class Cube_Base
{

protected:

const float dimension;

private:

CubeCoords coords;

... ometto il resto perchè non è rilevante

};


Ora, quello che voglio è inizializzare verticesOBS e vertices (dentro alla struct CubeCoords) con 8 elementi di tipo Vector3D.
Lo ho fatto in questo modo (stupido) dentro al costruttore della classe Cube_Base e vorrei sapere qual'è la forma contratta per farlo:

coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));
coords.verticesOBS.push_back(new Vector3D(0, 0, 0));


Nella documentazione online viene riportato come esempio il costruttore:

std::vector<int> second (4,100); // four ints with value 100


Ma non capisco come usarlo nel mio caso.

vendettaaaaa
31-08-2013, 11:31
Mi par di ricordare che usavi un compilatore che supporta C++11, quindi utilizza una std::initializer_list e inizializza il tuo vector nella dichiarazione dentro alla struct:
struct CubeCoords
{
std::vector<Vector3D> verticesOBS = { Vector3D(0, 0, 0), ripeti altre 7 volte };

// OPPURE

std::vector<Vector3D> verticesOBS = std::vector<Vector3D>(8, Vector3D(0, 0, 0));
};
L'inizializzazione dei membri nella definizione della classe ha lo stesso effetto, anche prestazionalmente, che inizializzare le stesse variabili nel costruttore (e non dico dentro al corpo, ma nella sezione di inizializzazione del costruttore, tra lista parametri e corpo), e rende il codice molto più pulito :D

vendettaaaaa
31-08-2013, 13:49
Senza contare che se il costruttore di default di Vector3D inizializza le coordinate a 0, puoi tralasciare di scrivere esplicitamente il valore.

Ah, il tuo modo col push_back è sbagliato! L'operatore new restituisce dei puntatori, mentre il tuo vector contiene oggetti, non i loro puntatori...

Tommo
31-08-2013, 14:18
Se il compilatore e Vector3D supportano le initializer lists:


coord.verticesOBS = {
{ 0,0,0 },
{ 0,0,0 },
{ 0,0,0 },
{ 0,0,0 },
{ 0,0,0 },
{ 0,0,0 },
{ 0,0,0 },
{ 0,0,0 }
};


Altrimenti,

//definisci una funzione tipo questa
std::vector< Vector3D > make_vertices( float[] coord )
{
std::vector< Vector3D > res;
int vertices = sizeof(coord)/(sizeof(float)*3);
for( int i = 0; i < vertices; i += 3 )
res.push_back(Vector3D( coord[i],coord[i+1],coord[i+2] ) );
return res;
}

//e usala cosi'
float coords[] = {
0,0,0,
0,0,0,
0,0,0,
0,0,0,
0,0,0,
0,0,0,
0,0,0,
0,0,0,
};
coord.verticesOBS = make_vertices(coords);


Ovviamente e' piu' lento e piu' brutto :D
Altrimenti, se ti serve solo di inizializzare tutto con lo stesso valore, il piu' facile:


coords.verticesOBS.resize( 8, Vector3D(0,0,0) );


Tra l'altro, se Vector3D ha un costruttore senza parametri "Vector3D()" che inizializza xyz a 0, puoi scrivere solo


coord.verticesOBS.resize( 8 );


e gli altri metodi sono inuitilmente generici :D

-Ivan-
01-09-2013, 14:11
Grazie, correggo subito gli errori e sostituisco.
Quanta roba che sbaglio ancora. Verranno tempi migliori!