Dollarslice
Dollarslice

Reputation: 10284

Passing vectors by reference

If I have a vector of objects in one class which I want to change in another, I would try and pass all the information by reference.

What exactly do I need to pass by reference though? The vector? The objects? Both?

Essentially what I'm asking is: What is the difference between these?

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

I'm not actually sure how referencing of array like containers work. Are these legal?

Upvotes: 26

Views: 69987

Answers (3)

jk.
jk.

Reputation: 13984

Another option is to pass around iterators instead of containers. This is the approach the standard library takes in <algorithm>. They are slightly more verbose at the calling site, but they have the advantage that they work for parts of a collection as well as complete collections and decouples the algorithm from the container.

Lastly, of course, it's worth while checking you know your algorithms as there may already be one that does what you want.

Upvotes: 2

Cat Plus Plus
Cat Plus Plus

Reputation: 129754

vector&<object> is a syntax error. vector<object&> is invalid, because a vector's value type must be assignable. vector&<object&> blah is a syntax error.

A reference to a vector is vector<T>&.

Upvotes: 58

Kerrek SB
Kerrek SB

Reputation: 476950

You cannot have a vector of references. Vector elements must be copyable and assignable, which references are not. So only the first option is actually an option, but it's spelled std::vector<Object> &.

Note that v[1] already returns a reference to the second element, so you can happily pass individual elements by reference.

It is possible to have a vector of reference-wrappers a la std::ref, but if you don't know what that is, you probably shouldn't be using it at this point.

Upvotes: 5

Related Questions