C++, comment correctement copie std::vector< *> dans le constructeur de copie?

Je suis en utilisant deux classes

//This is generic data structure containing some binary data
class A {
public:
    A();
    A(const A&);
    ~A();
}

//Main data container
class B {
public:
    B();
    B( const B&);
    ~B();
protected:
    std::vector<A *> data;
}

//Copy constructor for class b
B::B( const B& orig):data() {
    for( std::vector<A *>::const_iterator it = orig.data.begin();
        it < orig.data.end(); ++it){
        data.push_back( new A( *(*it)));
    }
}

Je suppose que cette classe serait faire le travail, mais je suis la recherche de façon à atteindre le total de la perfection.

Au premier :data() - est-ce initialisation requis pour initialiser le vecteur vide correctement (et c'est une partie de l'écriture d'un bon et propre code)?

Comment utiliser vector::iterator dans le constructeur de copie, le seul moyen que j'ai trouvé est celui que j'ai écrit dans le code (const devrait être obligatoire pour le constructeur de copie).

De copier simplement vecteur copier les valeurs de pointeur et non pas l'ensemble des objets?

Et, enfin, de nouvelles données d'initialisation... Est-il de toute façon, comment pourrais-je remplacer la totalité de la boucle avec un plus petit morceau de code et/ou est-il un standard-comment écrire constructeur de std::conteneurs qui contient des pointeurs d'objet?

Sous-question: je suis en supposant à l'aide de vector<A *> est beaucoup plus approprié et efficace pour diverses raisons que juste vector<A> (pas la copie de tous les temps, le pouvoir de décider (ou pas) pour copier des objets...)

Vouliez-vous dire "Sous-question: je suis en supposant à l'aide d'un vecteur de pointeurs..."
Préallouer data dans la liste des initialiseurs. À l'aide de push_back() comme ça, c'est très inefficace.
Sous réponse: je pense que, si vous ne pas utiliser les pointeurs, vous ne pas de les utiliser.
Je n'ai jamais utilisé de boost, mais je suis sûr qu'il a une solution pour ce problème (il l'a toujours des solutions pour des problèmes qui semblent communs).
Comme la accepté de répondre à des spectacles, l'obtention de ce droit avec l'ensemble de la gestion des exceptions est une douleur. Un vecteur de pointeurs intelligents ou un std::deque d'objets est généralement mieux. (Aussi, pour les petits objets, un vecteur de pointeurs est généralement plus lent que un vecteur d'objets, trop d'indirections et les appels à new/delete)

OriginalL'auteur Vyktor | 2012-01-14