vector对象增长容量大小测试

vector对象增长说明

  在C++中,vector是一个非常好用的容器,该容器大小可变,而且将元素连续储存。如果容器的储存空间已满,此时向容器中添加新元素,则容器必须分配新的内存空间来保存已有元素和新元素,将已有元素从旧位置移动到新空间中,然后添加新元素,释放旧储存空间。这样就会导致每次添加新元素时,vector就执行一次内存分配和释放操作,性能会明显的变慢。
  为了避免这种问题,标准库采用了减少容器空间重新分配次数的策略:当不得不获取新的内存空间时,vector和string的实现通常会分配比新的空间需求更大的内存空间
下面来看看测试程序,测试平台VScode + GCC:

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();
}

其结果如下:
vector
可以发当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;

结果如下图:
在这里插入图片描述
通过此次小测试(平台:VScode + GCC),说明了vector扩展内存的方式:将当前的容量进行翻倍处理

将以上程序在VS2013中测试,测试结果如下:
在这里插入图片描述
在此平台下(VS2013),vector扩展内存的方式:对当前的容量扩容至1.5倍

小结
通过上述两个测试说明vector在不同平台下,扩容方式存在差异:在GCC下是扩容至当前容量的2倍,而在vs下是扩容至当前容量的1.5倍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章