c++ - sirven - punteros y vectores en c
¿Debería un std:: vector de objetos usar punteros, referencias o nada? (2)
Utilice el tipo T
Recuerde que el operator[]
devuelve una referencia (const), por lo que su Apple&
funciona bien allí:
T& vector<T>::operator[](size_t);
const T& vector<T>::operator[](size_t) const;
Es por eso que puedes usar vec[3].make_older()
para comenzar si return_type Apple::make_older(void)
existe.
Sin embargo, tenga en cuenta que hay muchos métodos que invalidan las referencias, por lo que
Apple& reference = vec[3];
vec.push_back(other_apple);
reference.get_eaten();
podría resultar en un comportamiento indefinido si push_back
reasignó la manzana referenciada.
Supongamos que tenemos alguna clase, digamos class Apple
, y quisiéramos almacenar un std::vector
contenga Apple
.
¿Debería el vector contener punteros, referencias u objetos 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
Mi objetivo es hacerlo así cuando llame.
Apple& a = vector[4];
La Apple
no será copiada.
He estado usando C ++ durante más de un año y siempre he trabajado para solucionar esto y nunca lo entendí. ¿Existe una explicación simple de por qué uno de estos tres enfoques es la mejor práctica?
Utilizar:
std::vector<Apple> vector; // I don''t know if this copies the Apple on each lookup
Si bien todos ellos lograrían su objetivo (una búsqueda nunca se copia), este es el que permite que el vector
posea la Apple
en ella para que las vidas sean manejadas con sensatez.