vector容器resize和reserve探究

为什么要用resize和reserve

容器在添加元素时会有扩容操作,进行预申请内存。示例如下:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec;
    cout << "vec.size : " <<vec.size() << " vec.capacity : " <<vec.capacity() <<endl<<endl;

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

    return 0;
}

输出:

vec.size : 0 vec.capacity : 0

vec.size : 1 vec.capacity : 1
vec.size : 2 vec.capacity : 2
vec.size : 3 vec.capacity : 3
vec.size : 4 vec.capacity : 4
vec.size : 5 vec.capacity : 6
vec.size : 6 vec.capacity : 6
vec.size : 7 vec.capacity : 9
vec.size : 8 vec.capacity : 9
vec.size : 9 vec.capacity : 9
vec.size : 10 vec.capacity : 13
vec.size : 11 vec.capacity : 13
vec.size : 12 vec.capacity : 13
vec.size : 13 vec.capacity : 13
vec.size : 14 vec.capacity : 19
vec.size : 15 vec.capacity : 19
vec.size : 16 vec.capacity : 19
vec.size : 17 vec.capacity : 19
vec.size : 18 vec.capacity : 19
vec.size : 19 vec.capacity : 19
vec.size : 20 vec.capacity : 28

动态申请内存
vector扩容时动态申请内存,扩容之后在新申请的内存地址上把旧元素拷贝到新的地址上,然后释放旧元素所在内存。若是容器中存的是占用内存比较大的类时。非常影响性能,所以能够预先的知道容器的个数,或者大致个数。在添加元素前进行合理的内存分配,阻绝扩容的发生,将会无形的提示代码效率。
capacity 函数
capacity 是容器申请的内存容量,capacity 大于容器的size 是很正常的事。

resize函数

原型

void resize (size_type n);
void resize (size_type n, const value_type& val);

resize 是改变容器的大小,不会改变已有元素的值
1.原容器size < n 。capacity 扩容到 n ,size 增加到 n 。已存在的元素不变,剩下的空位 用默认值填充到 size 大小。
2.原容器size > n 。capacity 不变,size 减到n 。多出的元素其实还是存在在内存上的,但是再去访问就非法了。
3. =
无变化

演示

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    auto printVec = [](vector<int>& vec){
        cout << "vec.size : " << vec.size() << " vec.capacity : " << vec.capacity() <<endl;
        for (auto& it : vec){
            cout << "element : " << it << endl;
        };
        cout << "**********************************************" << endl;
    };
    cout << "新容器初始状态" << endl;
    vector<int> vec;
    printVec(vec);

    cout << "默认值初始化,容器大小 = 3" << endl;
    vec.resize(3);
    printVec(vec);

    cout << "容器大小设定为 2 ,参数使用 111" << endl;
    vec.resize(2, 111);
    printVec(vec);

    cout << "容器大小设定为 4 ,参数使用 222" << endl;
    vec.resize(4, 222);
    printVec(vec);

    return 0;
}

输出:

新容器初始状态
vec.size : 0 vec.capacity : 0
**********************************************
默认值初始化,容器大小 = 3
vec.size : 3 vec.capacity : 3
element : 0
element : 0
element : 0
**********************************************
容器大小设定为 2 ,参数使用 111
vec.size : 2 vec.capacity : 3
element : 0
element : 0
**********************************************
容器大小设定为 4 ,参数使用 222
vec.size : 4 vec.capacity : 4
element : 0
element : 0
element : 222
element : 222
**********************************************

reserve函数

原型

void reserve (size_type n);

reserve 设置容器容量的大小 不改容器的元素和size。只有 n > 原容器的容量才会调用成功。

演示

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    auto printVec = [](vector<int>& vec){
        cout << "vec.size : " << vec.size() << " vec.capacity : " << vec.capacity() <<endl;
        for (auto& it : vec){
            cout << "element : " << it << endl;
        };
        cout << "**********************************************" << endl;
    };
    cout << "新容器初始状态" << endl;
    vector<int> vec;
    printVec(vec);

    cout << "设置容量大小 = 2" << endl;
    vec.reserve(2);
    printVec(vec);

    cout << "设置容量大小 = 1" << endl;
    vec.reserve(1);
    printVec(vec);

    return 0;
}

输出:

新容器初始状态
vec.size : 0 vec.capacity : 0
**********************************************
设置容量大小 = 2
vec.size : 0 vec.capacity : 2
**********************************************
设置容量大小 = 1
vec.size : 0 vec.capacity : 2
**********************************************

扩展

容器使用后 clear

直接撸代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    auto printVec = [](vector<int>& vec){
        cout << "vec.size : " << vec.size() << " vec.capacity : " << vec.capacity() <<endl;
        for (auto& it : vec){
            cout << "element : " << it << endl;
        };
        cout << "**********************************************" << endl;
    };
    cout << "新容器初始状态" << endl;
    vector<int> vec;
    printVec(vec);

    cout << "设置容量大小 = 2,333 作为填充参数" << endl;
    vec.resize(2, 333);
    printVec(vec);

    cout << "容器清空后,容量没变" << endl;
    vec.clear();
    printVec(vec);

    return 0;
}

输出:

新容器初始状态
vec.size : 0 vec.capacity : 0
**********************************************
设置容量大小 = 2,333 作为填充参数
vec.size : 2 vec.capacity : 2
element : 333
element : 333
**********************************************
容器清空后,容量没变
vec.size : 0 vec.capacity : 2
**********************************************

小结

容器都是在堆上new的空间,若使用不当既浪费内存,又影响效率。了解原理后要根据实际场景,灵活的运用容器,写出高效的代码。

效率排行:
数组>动态数组>预先reverse的vector>vector。

作为写C出身的我一直奉行效率第一,但是容器用起来太香了,以至于忘记了效率第一的初心。日后改之

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值