来源: https://blog.csdn.net/mfcing/article/details/8746256
简述
关于vector,简单地讲就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时会自动申请另一片更大的空间,然后把原有数据拷贝过去,接着释放原来的那片空间;当释放或者说是删除里面的数据时,其存储空间并不会释放,仅仅只是清空了里面的数据
vector的内存分配机制
capacity()
返回的是当前vector对象缓冲区(后面的对vector维护的内存空间皆称为缓冲区)实际申请的空间大小,
size()
返回的是当前对象缓冲区中存储数据的个数,
capacity永远是大于等于size的,当size和capacity相等时继续添加数据时vector会扩容。
扩容:每次扩容都是增加当前空间的50%(第一次除外);
vector实现
如何强制释放vector的缓冲区
vector<int>().swap(arr); //强制释放空间
vector<int> temp;
arr.swap(temp);//临时变量会被析构
如何使用提高性能
使用的三种方式:
- 直接每次
push_back()
- 使用
resize()
提前分配空间(这样就不用了扩容了) - 使用
reserve
提前分配空间
MSDN中,这两个个函数的说明分别是:
- reserve : Reserves a minimum length of storage for a vector object, allocating space if necessary.
- resize :Specifies a new size for a vector.
reserve和resize区别
在这里我们初始化的时候使用感觉好像是差不多。
测试用例
#include "stdafx.h"
#include "btree.h"
#include <vector>
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <time.h>
using std::ofstream;
using std::cout;
using std::endl;
using std::vector;
int _tmain(int argc, _TCHAR* argv[])
{
/************************************************************************/
/* vector如何强制释放内存空间 */
/* 默认只有析构时才会释放 */
/************************************************************************/
vector<int> arr;
cout<<"默认情况未初始化时,capacity="<<arr.capacity()<<endl;
arr.resize(100,100);
arr.reserve(50);
arr.resize(50);
cout<<"现在,capacity="<<arr.capacity()<<endl;
vector<int>::iterator itor=arr.begin()+10;
arr.erase(arr.begin(),itor);
cout<<"capacity="<<arr.capacity()<<",size="<<arr.size()<<endl;
// //方法一、
vector<int>().swap(arr); //强制释放空间
//方法二、
{
vector<int> temp;
arr.swap(temp);
}//临时变量会被析构
cout<<"capacity="<<arr.capacity()<<",size="<<arr.size()<<endl;
clock_t start=clock();
for(int num=0;num<10000;++num)
{
vector<int> v1;
for(int i=0;i<100;++i)
v1.push_back(i);
}
cout<<"直接push循环10000次用时:"<<clock()-start<<endl;
start=clock();
for(int num=0;num<10000;++num)
{
vector<int> v2;
v2.resize(100);
for(int i=0;i<100;++i)
v2[i] = i;
}
cout<<"先resize预设大小再push循环10000次用时:"<<clock()-start<<endl;
start=clock();
for(int num=0;num<10000;++num)
{
vector<int> v3;
v3.reserve(100);
for(int i=0;i<100;++i)
v3.push_back(i);
}
cout<<"先reserve预设大小再push循环10000次用时:"<<clock()-start<<endl;
vector<int> v4;
ofstream wf("2.txt");
int nFlag=v4.capacity();
for(int i=0;i<100;++i)
{
v4.push_back(i);
if(nFlag!=v4.capacity())
{
nFlag=v4.capacity();
cout<<"new buffer size="<<nFlag<<endl;
wf<<"capacity="<<nFlag<<endl;
}
}
wf.close();
cout<<"max_size="<<arr.max_size()<<endl;
return 0;
}
运行结果