capacity of the vector changes after push_back()
c++, c++11, stdvector
Solution
Because taking a vector `A` and copying it to vector `B` does not guarantee that vector `B` will have the same capacity as vector `A`. Typically, the new vector will allocate only enough memory to hold the elements being copied into it.
In fact, there's an old trick that makes use of this, called the reduce-capacity trick:
int main()
{
vector<int> v { 1,2,3,4,5 };
v.clear(); // capacity still non-zero
vector<int>(v).swap(v); // capacity now zero (maybe)
}
… though, technically, whether this actually works is entirely implementation-dependent.
If you move the vector in, rather than copying it, then there are no re-allocations, the buffer is actually the same buffer, and the capacity does not change:
#include <iostream>
#include <vector>
using namespace std;
struct Cell
{
vector<int> vtx;
};
int main()
{
vector <Cell> cells;
Cell tmp;
tmp.vtx.reserve(5);
cout << tmp.vtx.capacity() << endl;
cells.push_back (std::move(tmp));
cout << cells[0].vtx.capacity() << endl;
return 0;
}
// 5
// 5
(Notice that I had to move the first `cout` call to before the move, otherwise I'd be `cout`ing something that is in an unknown state.)
Problem
Could someone explain why I do not get the same outputs? main.cpp: ``` #include <iostream> #include <vector> using namespace std; struct Cell { vector<int> vtx; }; int main() { vector <Cell> cells; Cell tmp; tmp.vtx.reserve(5); cells.push_back (tmp); cout << tmp.vtx.capacity() << endl; cout << cells[0].vtx.capacity() << endl; return 0; } ``` Output: ``` 5 0 ```