Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One question about vector push_back

Tags:

c++

vector

I just noticed that for vector push_back it is push back a reference to the element.

void push_back ( const T& x );

My question is does the memory layout changed after push_back?

For example, I have an array first which containing five elements and the layout is like this.

|          |          |          |          |          |              
|   A1     |     A2   |   A3     |    A4    |    A5    |

Now I have a vector v

v.push_back(A3)

Now, how does the memory look like?

How does the vector store the elements here?

How does the vector access the element?

like image 593
skydoor Avatar asked Aug 17 '26 07:08

skydoor


2 Answers

A vector stores by value not by reference.

When you re-add the same element, a copy will be stored at the end. If you do not want to make a copy of the values you are inserting into the vector, then you should use pointers instead.

Example:

std::vector<std::string> v;
string s = "";
v.push_back(s);
s = "hi";
v.push_back(s);

v now contains 2 different elements, one with an empty string, and one with a string which contains "hi". Both strings in the vector remain independent from s.

Note: The internal implementation details of an STL container can vary, there is no guarantee that it will be implemented a certain way; however, the semantics of how an STL container works, will remain the same no matter what the internal implementation is.

like image 142
Brian R. Bondy Avatar answered Aug 23 '26 23:08

Brian R. Bondy


Now, how does the memory look like? and How does the vector store the elements here?

There are two possible outcomes:

  1. The vector's memory block is not large enough to contain the items, therefore the underlying memory is reallocated. Objects are copied (using their copy constructors) to their new locations. Then the push_back'd object is copied (by value) to the end.
  2. The vector's memory block is large enough, new elements are copied (by value) to the end.

How does the vector access the element?

The same way you access a C-style array. BasePointer + index

like image 34
Billy ONeal Avatar answered Aug 23 '26 22:08

Billy ONeal



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!