web-dev-qa-db-fra.com

Un vecteur d'objets std :: doit-il utiliser des pointeurs, des références ou rien?

Supposons que nous ayons une classe, disons class Apple, et voulait stocker un std::vector contenant Apple.

Le vecteur doit-il contenir des pointeurs, des références ou des objets simples?

std::vector<Apple*> vector; // Definitely won't copy the Apple on lookup, 
    // but I would prefer not to use pointers if I don't have to
std::vector<Apple&> vector; // Seems circuitous?
std::vector<Apple> vector; // I don't know if this copies the Apple on each lookup

Mon objectif est de le faire quand j'appelle

Apple& a = vector[4];

le Apple ne sera pas copié.

J'utilise C++ depuis plus d'un an et j'ai toujours travaillé autour de cela et je ne l'ai jamais compris. Existe-t-il une explication simple de la raison pour laquelle l'une de ces trois approches est la meilleure pratique?

22
helper

Utilisez le type T. N'oubliez pas que operator[] Renvoie une référence (const), donc votre Apple& Fonctionne bien là:

      T& vector<T>::operator[](size_t);
const T& vector<T>::operator[](size_t) const;

C'est pourquoi vous pouvez utiliser vec[3].make_older() pour commencer si return_type Apple::make_older(void) existe.

Cependant, gardez à l'esprit qu'il existe de nombreuses méthodes qui invalident les références, donc

Apple& reference = vec[3];
vec.Push_back(other_Apple);

reference.get_eaten();

peut entraîner un comportement indéfini si Push_back réalloue l'Apple référencé.

20
Zeta

Utilisation:

std::vector<Apple> vector; // I don't know if this copies the Apple on each lookup

Bien que tous atteignent votre objectif (une recherche ne copie jamais), c'est celle qui permet aux vector de posséder les Apples afin que les durées de vie soient gérées de manière raisonnable.

11
David Schwartz