2009-07-16 7 views
1

J'essaie d'optimiser le code suivant pour éviter d'avoir à copier et coller et utiliser correctement SlaveForce et SlavePos, qui sont de type float [6], et baseForce et basePos sont de type vectoriel:Optimisation de manipulation de vecteurs C++

typedef struct _NodeCoord 
{ 
    float coords[6]; 
} NodeCoord; 

int main() 
{ 
    ... 
    memcpy(tempNodeCoord.coords, SlaveForce, 6*sizeof(float)); 
    baseForce.push_back(tempNodeCoord); 
    memcpy(tempNodeCoord.coords, SlavePos, 6*sizeof(float)); 
    basePos.push_back(tempNodeCoord); 
    ... 
} 

J'ai essayé quelques codes de test. Seul ce travail semble:

std::vector<NodeCoord> tallon; 
NodeCoord m; 
memset(m.coords, 0, sizeof(m.coords)); 
tallon.push_back(m); 

alors que c'est le long des lignes de ce que je veux accomplir, mais il ne fonctionne pas:

std::vector<float[6]> ed; 
float e[6]; 
tallon.push_back(e); 

J'ai aussi essayé d'écrire un « typedef float [6 ] Mon type;" ligne avant la fonction principale, mais cela ne fonctionne pas bien non plus. Y at-il quelque chose que je peux faire pour éliminer les appels de fonction memcpy (ou plutôt push_back les variables float [6] directement)? Merci d'avance.

Répondre

1

Afin d'être stockable dans un vecteur, un type doit être copiable et assignable, et les tableaux de type C ne sont ni l'un ni l'autre. Vous devriez plutôt utiliser un autre vecteur, ou peut-être envelopper le tableau dans une structure.

+0

Quelle serait la différence entre utiliser un autre vecteur et encapsuler le tableau dans une structure (qu'est-ce que je fais déjà)? – stanigator

+0

Le tableau enveloppé sera probablement plus rapide, mais moins flexible - par exemple, vous ne pouvez pas trouver combien de choses sont réellement dans un tableau. –

+0

Est-ce que je ne peux pas utiliser sizeof (array)/sizeof (element) pour connaître le nombre d'éléments dans le tableau? – stanigator

2

Essayez un vecteur de vecteurs:

std::vector<std::vector<float> > ed; 

ed.push_back(std::vector<float>(6, 0.0f)); 

Dans ce cas, je pousse un vecteur temporaire de flotteurs, avec 6 éléments avec la valeur de 0.0f;

Info on vector's constructors.

2

Ceci est C++, pourquoi ne pas essayer une classe?

class NodeCoord { 
public: 
    float coords[6]; 
    NodeCoord() {memset(coords, 0, sizeof(coords));}; 
    ~NodeCoord() {}; 
}; 

std::vector<NodeCoord> tallon; 
tallon.push_back(NodeCoord()); 

cout << tallon.front().coords[0]; 

Et vous pouvez faire beaucoup plus avec la classe, si vous choisissez. Si vous souhaitez éviter les copies, faites simplement des copies superficielles de la classe dans un constructeur de copie.