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
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.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With