S'il vous plaît considérer les éléments suivants en place:C++ conteneur STL et la construction
class CMyClass
{
public:
CMyClass()
{
printf("Constructor\n");
}
CMyClass(const CMyClass&)
{
printf("Copy constructor\n");
}
};
int main()
{
std::list<CMyClass> listMyClass;
listMyClass.resize(1);
return 0;
}
Il produit la sortie suivante:
Constructor
Copie constructeur
Maintenant, mon question est: Comment puis-je éviter le constructeur de copie? Ou pour le dire d'une autre manière: Comment puis-je créer des objets dans un conteneur STL sans l'opération de copie inutile. Existe-t-il un moyen de réaliser une construction "sur place" en utilisant le constructeur par défaut?
Mise à jour - réponses à ce jour:
- Il ne peut pas être fait
- Utilisez des pointeurs ou des pointeurs intelligents au lieu.
Les pointeurs intelligents sont excessifs pour mon application. Mais je me demande vraiment pourquoi cela ne peut pas être fait. Cela semble être une chose si évidente à vouloir faire. D'autres idées? Je vais même accepter un hack méchant si ça marche ...
Solution
Je pense que je viens de trouver une solution pour mon problème de tous les commentaires et les réponses posées ici. La solution est de construire un objet vide et de le garder dans le seul but de l'utiliser plus tard pour faire des copies propres de. Ensuite, vous pouvez utiliser l'une des méthodes qui prennent une référence (comme push_back ou insert). Cela appelle encore le constructeur de copie pour chaque nouvel objet inséré, mais au moins il est à la fois le constructeur par défaut et constructeur de copie:
int main()
{
CMyClass Empty;
std::list<CMyClass> listMyClass;
for (int c=0; c<10; ++c)
{
listMyClass.push_back(Empty);
}
return 0;
}
Il peut sembler un chose évidente, mais d'un point de vue fonctionnel, peu importe et plusieurs algorithmes (trier, supprimer, ...) utilisent aussi la copie, alors préparez-vous à être copié;) (Voir aussi http: //www.devx .com/tips/Tip/13606) – stefaanv
Une chose évidente à faire? Pourquoi donc? Pourquoi est-ce que copier un problème? – jalf
Évident? Si vous appeliez 'mylist.resize (10)', comment vous attendriez-vous à finir avec dix objets distincts s'ils ne sont pas des copies? – visitor