2009-03-24 6 views
3

Y a-t-il un problème à repousser un vecteur de vecteurs? commePousser vecteur de vecteurs

typedef vector<Point> Polygon; 
vector<Polygon> polys; 
polys.push_back(some_poly); 

Tous les éléments some_poly seront copiés droit?

J'ai un bug dans mon code et je n'arrive pas à comprendre ce qui ne va pas.

Répondre

2

Oui, cela devrait fonctionner correctement, aussi longtemps que vous avez défini un constructeur de copie et opérateur d'affectation pour votre Point de classe (et assuré qu'ils font la bonne chose, etc). std :: vector va très bien, donc le bug doit être ailleurs - il va de soi que nous aurons besoin de plus de détails pour aller plus loin.

Il y a des implications de performance si vous voulez pousser un vecteur de choses, mais ne vous inquiétez pas jusqu'à ce que ça fonctionne (et seulement si cela devient un problème).

+0

Le "class" Polygon (en fait un typedef) a déjà un bon constructeur de copie. Vous voulez probablement dire la classe Point. – ahy1

+0

Oui, je l'ai fait.Merci pour cela - ont corrigé :-) – Peter

2

Rien de mal à cela. Ce n'est pas la structure la plus efficace pour les insertions/effacements, mais cela devrait certainement fonctionner.

Si vous êtes intéressé à faire insertions/ratures plus efficace, vous devriez passer probablement:

typedef vector<Point> Polygon; 
typedef vector<Polygon*> Polygons; 
Polygons polys; 
polys.push_back(new Polygon()); 
+0

Mais alors vous devez vous soucier de la gestion des ressources. Vous devrez supprimer ces pointeurs lorsque vous aurez terminé. –

+0

J'ose dire que la classe "Polygons" devrait être le propriétaire et peut gérer la désallocation. La gestion des ressources n'est pas si mauvaise tant que vous respectez les règles de propriété claires. Mais votre point est valide. –

6

À droite, le vecteur est copié comme prévu. Il y a un bon logiciel appelé geordi qui peut montrer:

{ 
    using namespace tracked; 
    typedef vector<B> poly_t; 
    poly_t poly(3); // contains 3 B's 
    vector<poly_t> v; 
    v.push_back(poly); 
} 

Il suit la création/copies de tracked::B. Voici le résultat:

B0* B1*(B0) B2*(B0) B3*(B0) B0~ B4*(B1) B5*(B2) B6*(B3) B4~ B5~ B6~ B1~ B2~ B3~ 

Ceci est sortie lorsque nous suivons seulement v.push_back:

B4*(B1) B5*(B2) B6*(B3) 

Comme vous le voyez, la première est créée comme B0 l'argument par défaut du constructeur de vecteur. Ensuite, cet objet est copié dans 3 B et ensuite B0 est à nouveau détruit lorsque le constructeur revient. poly est alors créé. Ensuite, nous le repoussons dans un vecteur de polygones. L'argument, poly, est copié dans un nouveau vecteur qui est créé dans le vecteur des polygones et géré par celui-ci.

S'il tombe en panne, le problème se situe probablement dans une autre partie de votre programme. Vérifie que le constructeur/constructeur de copie et le destructeur fonctionnent correctement et qu'ils ne suppriment pas les éléments deux fois si vous utilisez l'allocation de mémoire dynamique.

+0

Merci pour la réponse complète! Ce doit être un bug de logique alors. Les mauvais éléments sont copiés, mais c'est une autre question. – mpen

1

Bien qu'il n'y ait rien de mal avec un vecteur de vecteurs, vous voudrez peut-être regarder Boost.MultiArray. Cela peut être plus efficace.

typedef boost::multi_array<Point, 2> Polygons; 

Une autre idée est que vous pouvez faire Polygon une véritable classe (contenant probablement un vecteur) pour fournir des méthodes plus adaptées que celles fournies par défaut avec std :: vector.

Questions connexes