vector对象增长说明
在C++中,vector是一个非常好用的容器,该容器大小可变,而且将元素连续储存。如果容器的储存空间已满,此时向容器中添加新元素,则容器必须分配新的内存空间来保存已有元素和新元素,将已有元素从旧位置移动到新空间中,然后添加新元素,释放旧储存空间。这样就会导致每次添加新元素时,vector就执行一次内存分配和释放操作,性能会明显的变慢。
为了避免这种问题,标准库采用了减少容器空间重新分配次数的策略:当不得不获取新的内存空间时,vector和string的实现通常会分配比新的空间需求更大的内存空间
下面来看看测试程序:
int main()
{
vector<int> a;
cout <<"未添加元素前"<< endl;
cout <<"vector a size: " << a.size() << endl;
cout <<"vector a capacity : " << a.capacity() << endl;
cout << endl;
//向a中添加10个元素
for(size_t i = 0; i < 10; i++)
{
a.push_back(i);
}
cout <<"添加10个元素后"<< endl;
cout <<"vector a size: " << a.size() << endl;
cout <<"vector a capacity : " << a.capacity() << endl;
cout << endl;
//将capacity设置为至少20
a.reserve(20);
cout <<"将capacity设置为20"<< endl;
cout <<"vector a size: " << a.size() << endl;
cout <<"vector a capacity : " << a.capacity() << endl;
cout << endl;
//向a中添加元素
while(a.size() != a.capacity())
a.push_back(0);
cout <<"向a中添加满元素"<< endl;
cout <<"vector a size: " << a.size() << endl;
cout <<"vector a capacity : " << a.capacity() << endl;
cout << endl;
//再添加一个1
a.push_back(1);
cout <<"待储存空间满后,再添加一个"<< endl;
cout <<"vector a size: " << a.size() << endl;
cout <<"vector a capacity : " << a.capacity() << endl;
cout << endl;
getchar();
}
其结果如下:
可以发当a.size() = a.capacity()
时,再向a中添加元素,vector会自动分配新的内存空间,容量是当前容量的两倍。当不想a占用这些空余的内存时,可以使用shrink_to_fit来使vector的大小与当前储存的元素数量一致,代码如下:
a.shrink_to_fit();
cout <<"清理多余的内存"<< endl;
cout <<"vector a size: " << a.size() << endl;
cout <<"vector a capacity : " << a.capacity() << endl;
cout << endl;
结果如下图:
通过此次小测试,基本上说明了vector扩展内存的方式:将当前的容量进行翻倍处理