2011-11-01 5 views
21

Se ho un vettore di oggetti in una classe che voglio cambiare in un altro, proverei a passare tutte le informazioni per riferimento.Passando vettori per riferimento

Che cosa esattamente devo passare per riferimento? Il vettore? Gli oggetti? Entrambi?

In sostanza quello che sto chiedendo è: qual è la differenza tra questi?

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??? 

io non sono sicuro di come in realtà riferimento della serie come contenitori funzionano. Sono legali?

+0

Che cosa è necessario modificare esattamente? Se hai bisogno di cambiare un oggetto, lo passi per riferimento. Se è necessario modificare il contenitore (ad esempio, aggiungere o eliminare un oggetto), si passa il contenitore. – Vlad

+0

E il riferimento è scritto correttamente come 'vector & blah;' – Vlad

+3

Mi raccomando [un buon libro introduttivo in C++] (http://stackoverflow.com/q/388242/46642). –

risposta

41

vector&<object> è un errore di sintassi. vector<object&> non valido, perché il tipo di valore di un vettore deve essere assegnabile. vector&<object&> blah è un errore di sintassi.

Un riferimento a un vettore è vector<T>&.

+0

ok così basta memorizzare un riferimento a un vettore ... e quando accedi a un elemento di detto vettore per indice stai effettivamente accedendo all'oggetto originale? – SirYakalot

4

Non è possibile avere un vettore di riferimenti. Gli elementi vettoriali devono essere copiabili e assegnabili, che i riferimenti non sono. Quindi solo la prima opzione è in realtà un'opzione, ma è digitata std::vector<Object> &.

Si noti che v[1] restituisce già un riferimento al secondo elemento, quindi è possibile passare felicemente i singoli elementi per riferimento.

È possibile avere un vettore di wrapper di riferimento a la std::ref, ma se non si sa cosa sia, probabilmente non si dovrebbe utilizzarlo a questo punto.

2

Un'altra opzione è passare intorno a iterators anziché in contenitori. Questo è l'approccio adottato da standard library in <algorithm>. Sono leggermente più prolissi sul sito di chiamata, ma hanno il vantaggio che funzionano per parti di una raccolta e anche raccolte complete e disaccoppiano l'algoritmo dal contenitore.

Infine, ovviamente, vale la pena di controllare il tuo algorithms poiché potrebbe essercene già uno che fa ciò che desideri.

Problemi correlati