2011-11-01 25 views
21

Si tengo un vector de objetos en una clase que quiero cambiar en otra, trataría de pasar toda la información por referencia.Pasando vectores por referencia

¿Qué es exactamente lo que necesito pasar por referencia? El vector? ¿Los objetos? ¿Ambos?

Esencialmente lo que estoy preguntando es: ¿Cuál es la diferencia entre estos?

vector&<object> blah; // A reference to a vector of objects? 

vector<object&> blah; // A vector of references to objects? 

vector&<object&> blah; // A reference to a vector of references to objects??? 

No estoy seguro de cómo funciona la referencia de los contenedores tipo array. ¿Son estos legales?

+0

¿Qué necesita cambiar exactamente? Si necesita cambiar un objeto, lo pasa por referencia. Si necesita cambiar el contenedor (por ejemplo, agregar o eliminar un objeto), pasa el contenedor. – Vlad

+0

Y la referencia está escrita correctamente como 'vector & blah;' – Vlad

+3

Recomendaré [un buen libro introductorio de C++] (http://stackoverflow.com/q/388242/46642). –

Respuesta

41

vector&<object> es un error de sintaxis. vector<object&> no es válido, porque el tipo de valor de un vector debe ser asignable. vector&<object&> blah es un error de sintaxis.

Una referencia a un vector es vector<T>&.

+0

ok así que solo almacena una referencia a un vector ... y cuando accede a un elemento de dicho vector por índice, ¿está realmente accediendo al objeto original? – SirYakalot

4

No puede tener un vector de referencias. Los elementos vectoriales deben ser copiables y asignables, y las referencias no lo son. Entonces, solo la primera opción es realmente una opción, pero está deletreado std::vector<Object> &.

Tenga en cuenta que v[1] ya devuelve una referencia al segundo elemento, por lo que puede pasar elementos individuales por referencia.

Es posible tener un vector de referencia-envolturas a la std::ref, pero si no sabe de qué se trata, probablemente no debería usarlo en este momento.

2

Otra opción es pasar alrededor de iterators en lugar de contenedores. Este es el enfoque que toma el standard library en <algorithm>. Son un poco más prolijas en el sitio de llamada, pero tienen la ventaja de que funcionan para partes de una colección, así como para completar colecciones y desacoplar el algoritmo del contenedor.

Por último, vale la pena comprobar si conoce su algorithms ya que puede haber uno que haga lo que quiera.