push_back()之后向量的容量发生了变化

时间:2014-07-09 17:49:12

标签: c++ c++11 stdvector

有人可以解释为什么我没有得到相同的输出吗?

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

1 个答案:

答案 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处于未知状态的内容。)