* Siam:
Hi,
I'm a little new to stl so bear with me...Say I have the following
code:
vector<intvec;
int i = 3;
vec.push_back(i);
i=4;
cout<<vec.at(0)<<endl;
Looking at the signature of push_back, it seems to take a reference:
void push_back( const TYPE& val );
I wouldve thought that means the int i pass to the vector isn't
copied, but a reference to the original int is placed in the vector.
However, the above code returns 3, not 4, indicating the int has been
copied into the vector (on printing memory addresses, the ints are
stored in different memory addresses). My question is, why does the
push_back function take a reference, but yet still store a copy of the
object in the vector?
Because std::vector can be used for any copyable type, and for some
types an object may have a lot of data to be copied, and/or copying the
object may involve dynamic allocation, which is (relatively) slow.
The reference passing means that an object that is expensive to copy is
only copied once, namely when copied into the vector's storage.
It's not copied in the process of being passed as argument, because with
a reference argument and a resonable compiler all that's passed (if
anything is passed!) is the object's memory address.
Using 'T const&' (or equivalently 'const T&') is a very common idiom for
objects that may be expensive to copy.
E.g., instead of writing a formal argument as 'std::string s', you
should as a matter of course write 'std::string const& s', even if
std::string might be expected to be heavily optimized and perhaps
directly supported by the compiler.
Caveat: don't do that for function results, e.g. don't declare a
function as 'std::string const& foo()' instead of 'std::string foo()'.
Because that might result in a dangling reference (the referred to
object doesn't exist after the function call has returned) and thus most
probably Undefined Behavior where undesirable things may happen.
Hope this helps,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?