有人可以解释为什么我没有得到相同的输出吗?
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;
}
输出:
5
0
答案 0 :(得分:16)
因为使用向量A
并将其复制到向量B
并不能保证向量B
具有与向量A
相同的容量。通常,新向量将仅分配足够的内存来保存复制到其中的元素。
事实上,有一个老技巧利用这个,称为减少容量技巧:
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)
}
......但从技术上讲,whether this actually works is entirely implementation-dependent。
如果移动向量,而不是复制它,则没有重新分配,缓冲区实际上是相同的缓冲区,容量不会改变:
#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
(请注意,我必须在移动前移动第一个cout
调用,否则我将cout
处于未知状态的内容。)