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?
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é.
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 Apple
s afin que les durées de vie soient gérées de manière raisonnable.