STL中vector的扩容和回收

vector求容器大小的函数:

size():返回当前vector元素的个数。

capacity():返回当前vector中最大能够存储的元素的个数。

vector的扩容

情况1:默认扩容(元素添加)

int main()
{
	vector<int> vec;
	
	//扩容1:当元素添加时导致的扩容。扩容为1.5或者2倍,跟编译器有关。
	for(int i=0;i<5;i++)
	{
		vec.push_back(i);
		cout<<"size="<<vec.size()<<endl;
		cout<<"capacity="<<vec.capacity()<<endl;
	}
	cout<<"---------------------------------------------"<<endl;
	return 0;
}

输出:

size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------

情况2:使用reserve()和resize()函数导致的扩容

reserve(int new_size)

  • 将容器扩大到能容纳new_size的大小
  • 扩大的只是容器的预留空间,空间内不正真创建元素对象
  • 改变capacity()的返回值,不改变size()的返回值
int main()
{
    vector<int> vec;

    for(int i=0;i<5;i++)
    {
        vec.push_back(i);
        cout<<"size="<<vec.size()<<endl;
        cout<<"capacity="<<vec.capacity()<<endl;
    }
    cout<<"---------------------------------------------"<<endl;

    //reserve()只为容器开辟预留空间,但在空间内不真正创建对象。
    //reserve()会改变容器capacity()的大小,但是不会改变容器size的大小。
    vec.reserve(10);
    cout<<"size="<<vec.size()<<endl;//30
    cout<<"capacity="<<vec.capacity()<<endl;//50

    copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
    return 0;
}

输出:

size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
size=5
capacity=10
0 1 2 3 4 

resize(int new_size, int init_value)

  • 第一个参数是指将要扩大到能容纳多少元素的大小;第二个参数是对扩大的空间进行初始化的值,如果不写,默认调用容器中存的元素的默认构造函数。

  • 将容器扩大到能容纳new_size的大小。

  • 改变容器的大小,并且创建对象。

  • 改变capacity()的返回值,改变size()的返回值。

int main()
{
    vector<int> vec;

    for(int i=0;i<5;i++)
    {
        vec.push_back(i);
        cout<<"size="<<vec.size()<<endl;
        cout<<"capacity="<<vec.capacity()<<endl;
    }
    cout<<"---------------------------------------------"<<endl;

    //resize()会改变容器的大小,而且创建对象。
    //resize改变容器的capacity()和容器的size()的大小。
    //resize(int new_size,int init_value)第一个参数是容器新的大小,
    //第二个参数是对开辟的内存的初始化,如果省略第二个参数,则调用其默认构造函数。
    vec.resize(10);

    vector<int>::iterator it=vec.begin();
    for(;it!=vec.end();++it)
    {
        cout<<*it<<‘ ’;
    }
    cout<<"size="<<vec.size()<<endl;//50
    cout<<"capacity="<<vec.capacity()<<endl;//63

    vec[9]=9;//可修改
    cout<<"vec[9]="<<vec[9]<<"  "<<"vec[8]="<<vec[8]<<endl;

    return 0;
}

输出:

size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
0 1 2 3 4 0 0 0 0 0
size=10
capacity=16
vec[9]=9  vec[8]=0

vector的回收

int main()
{
    vector<int> vec;

    for(int i=0;i<5;i++)
    {
        vec.push_back(i);
        cout<<"size="<<vec.size()<<endl;
        cout<<"capacity="<<vec.capacity()<<endl;
    }
    cout<<"---------------------------------------------"<<endl;

    //释放空间
    vec.clear();
    cout<<"size="<<vec.size()<<endl;
    cout<<"capacity="<<vec.capacity()<<endl;

    vec.erase(vec.begin(),vec.end());
    cout<<"size="<<vec.size()<<endl;
    cout<<"capacity="<<vec.capacity()<<endl;


    // 最简单的方法
    vector<int>(vec).swap(vec); //vec.swap(vector<int>())


    /*
	第一步:先产生一个和原先一样的临时对象
	第二步:临时量调用swap()函数两者进行交换。
	第三步:语句结束,临时量自动析构。
	*/
    {
        std::vector<int> tmp = vec;
        vec.swap(tmp);
    }

    cout<<"size="<<vec.size()<<endl;//0
    cout<<"capacity="<<vec.capacity()<<endl;//0
    return 0;
}

输出:

size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
size=0
capacity=8
size=0
capacity=8
size=0
capacity=0

所以,回收vector空间有两种方法:

方法1:

vector<int>(vec).swap(vec); //等价于vec.swap(vector<int>())

方法2:

{
	std::vector<int> tmp = vec;
	vec.swap(tmp);
}

使用clear()和erase()两个函数只是清空元素,但不回收内存。

先使用clear()再使用swap(),释放空间并且回收内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值