【C++】vector容器缩小capacity

vector容器是动态存储的,跟数组不同,定义vector的时候不需要声明容器的capacity。

首先说明一点,size是小于等于capacity的,一旦size超过了capacity,整个vector容器会“另辟居所”重新开辟更多的空间,这样也就造成了vector容器首地址发生改变。
下面是容器的size和capacity的关系:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    vector<int> v0;
    for (int i = 0; i < 100;i++)
    {
        v0.push_back(i);
    }
    cout << "v0 capacity is " << v0.capacity() << endl;//128
    cout << "v0 size is " << v0.size() << endl;//100

    vector<int> v1;
    for (int i = 0; i < 10000;i++)
    {
        v1.push_back(i);
    }
    cout << "v1 capacity is " << v1.capacity() << endl;//16384
    cout << "v1 size is " << v1.size() << endl;//10000
    return 0;
}

可以看出,vector容器会根据你传入的数据数量进行自动扩展,总是比你存入的数据多一些。

但是有一些时候我们不需要那么多开辟好的空间,对于数据size是确定的,这时候可以用匿名vector交换vector

先介绍一下vector的内置函数swap(),只贴核心代码了:

    vector<int> v1;
    v1.reserve(10000);//预设一个空间大小
    for (int i = 0; i < 100;i++)
    {
        v1.push_back(i);
    }
    cout << "v1 capacity is " << v1.capacity() << endl;//10000
    cout << "v1 size is " << v1.size() << endl;//100

    vector<int> v2;
    v2.reserve(5000);
    for (int i = 0; i < 50;i++)
    {
        v2.push_back(i);
    }
    cout << "v2 capacity is " << v2.capacity() << endl;//5000
    cout << "v2 size is " << v2.size() << endl;//50

    v2.swap(v1);
    cout << "v1 capacity is " << v1.capacity() << endl;//5000
    cout << "v1 size is " << v1.size() << endl;//50
    cout << "v2 capacity is " << v2.capacity() << endl;//10000
    cout << "v2 size is " << v2.size() << endl;//100

reserve()函数是预设一个大小,不会使其反复开辟,当然如果后续超过这个预设值,vector容器还是会自动开辟的。
上面的代码旨在展示swap()函数交换的是一整个容器,包含的是容器的capacity和数据的size。

交换缩小vector:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    vector<int> v1;
    for (int i = 0; i < 10000;i++)
    {
        v1.push_back(i);
    }
    cout << "v1 capacity is " << v1.capacity() << endl;//16384
    cout << "v1 size is " << v1.size() << endl;//10000

    v1.resize(3);
    cout << "v1 capacity is " << v1.capacity() << endl;//16384
    cout << "v1 size is " << v1.size() << endl;//3

    vector<int> temp(v1);
    cout << "temp capacity is " << temp.capacity() << endl;//3
    cout << "temp size is " << temp.size() << endl;//3
    temp.swap(v1);
    cout << "v1 capacity is " << v1.capacity() << endl;//3
    cout << "v1 size is " << v1.size() << endl;//3

    vector<int>(v1).swap(v1);//匿名容器,用后自动销毁。除了没有自己的变量名,其他的一样
    cout << "v1 capacity is " << v1.capacity() << endl;//3
    cout << "v1 size is " << v1.size() << endl;//3

    return 0;
}

上面的代码可以看出:一个vector如果是通过拷贝构造的,那么他的size和capacity相同,且等同于被拷贝的那个容器的size。

结合上面第二点的发现,swap函数是一整个交换的,这样理论上就可以用temp和v1换,最后使v1的size=capacity,节省了空间。另外,使用匿名容器更加高效方便。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值