2010-11-16 6 views
1

Je dois éviter le coût supplémentaire de la copie et de la destruction de l'objet contenu par un vecteur std :: causé par this answer.Utilisez std :: vector pour construire un objet et l'utiliser

En ce moment je l'utilise comme un std :: vector des pointeurs, mais je ne peux pas appeler std :: vector :: clear() sans supprimer chaque objet avant et je peux utiliser std :: auto_ptr avec std conteneurs.

Je voulais faire quelque chose comme ceci:

vector<MyClass> MyVec; 
MyVec.push_back(); 
MyClass &item = MyVec.back(); 

Cela créerait un nouvel objet avec le constructeur par défaut, puis je pourrais obtenir une référence et de travailler avec elle.

Des idées dans ce sens?

RÉSOLU: J'ai utilisé la réponse @MSalters avec la suggestion @ Moo-Juices pour utiliser des références C++ 0x rvalue pour utiliser la sémantique std :: move. Basé sur this article.

+3

est C++ 0x une option pour vous afin que vous puissiez profiter de std :: move sémantique? –

Répondre

1

On y est presque:

vector<MyClass> MyVec; 
MyVec.push_back(MyClass()); // Any decent compiler will inline this, eliminating temporaries. 
MyClass &item = MyVec.back(); 
+0

J'ai résolu ce problème en utilisant ET en utilisant C++ 0x std :: move sémantique (d'après ceci: http://msdn.microsoft.com/en-us/library/dd293665.aspx) – Vargas

3

Boost.PointerContainer Les classes géreront la mémoire pour vous. Voir en particulier ptr_vector.

Avec le conteneur boost::ptr_vector<T>, vous pouvez utiliser push_back(new T); et la mémoire pour les éléments T sera libérée lorsque le conteneur sera hors de portée.

+1

Bien que, comme nous l'avons fait hier, méfiez-vous que 'push_back (new T);' n'offre aucune garantie d'exception - il peut créer le T et ensuite lancer, en fuyant l'objet (http://stackoverflow.com/questions/4185350/is-it -safe-to-push-back-dynamically-assigned-object-to-vector/4185460). Toutefois, comme Steve lui-même l'a dit hier, si le reste de votre programme/système d'exploitation n'est pas robuste, il n'est peut-être pas nécessaire d'améliorer cette ligne. –

3

Au lieu de stocker des objets, stockez shared_ptr. Cela évitera la copie d'objet et détruira automatiquement l'objet lorsqu'il sera supprimé du vecteur.

+1

Ou 'unique_ptr', ce qui est beaucoup moins cher si vous savez que le vecteur sera propriétaire des objets pointés. – rubenvb

0

Vous pouvez le faire avec Redimensionner, qui par défaut construire des objets supplémentaires, il doit ajouter à la vector:

vector MyVec; 
MyVec.resize(MyVec.size() + 1); 
MyClass &item = MyVec.back(); 

Mais ne considérez pourquoi vous avez besoin de le faire. Le profilage at-il vraiment montré que c'est trop cher de copier les objets? Sont-ils non-copiables?

Questions connexes