STL中vector的扩容机制

文章详细介绍了C++标准库中的vector容器在内存管理上的特点,包括自动扩容机制,resize和reserve函数的作用。指出频繁的push_back操作可能导致性能下降,并通过示例展示了如何通过预分配容量来避免不必要的数据拷贝,提高程序效率。
摘要由CSDN通过智能技术生成

vector的特性类似于数组,在内存空间中拥有一段连续的空间。当插入新的元素内存不够时,会自动扩容,不同的编译器扩容的倍数也不一样,通常为原容量的两倍。扩容之后将原来的元素拷贝到新的内存空间上,然后把原来的内存空间释放掉。因为内存空间是连续的所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为On.

2、相关函数介绍

1、resize()函数

resize即重置容器空间。当设置值小于当前容器空间时,会将目前容器超出部分释放掉;当设置值(及函数的参数)大于当前容器空间时,会在当前空间基础上增加容量。

2、reserve()函数

预留容器空间。当设置值大于当前容器空间时,会增加当前容器空间的大小。

3、总结

● 扩容机制是自动扩容的,当然也可以自己通过函数扩容。扩容之后会把原来旧空间元素拷贝到新空间,如何把旧空间释放掉。

● 当vector的当前容器所用空间等于容器总空间时会发生扩容。

● 扩容的倍数不一定,通常是原空间的2倍或者1.5倍。

● 在日常使用中,如果只是简单的push_back(在vector最后插入一个元素)插入数据,会带来频繁的数据拷贝,这对程序执行效率影响很大,因此提前调整容器的空间对程序性能提升很有意义。

4、示例:

vector<int>dp(20);//以及提前说明dp数组大小为20.
    int n = 20;
    while (n--)
    {
        dp.push_back(1);
        cout << "当前使用的大小:" << dp.size()<<"  " << "总容量大小:" << dp.capacity() << endl;
    }

结果:发生了扩容,因为push_back是在最后一位插入,前面的dp(20)个元素值全为0.

vector<int>dp;//不提前说明dp的大小,效果是一样的,也发生了扩容。
    int n = 20;
    while (n--)
    {
        dp.push_back(1);
        cout << "当前使用的大小:" << dp.size()<<"  " << "总容量大小:" << dp.capacity() << endl;
    }

结果:发生了扩容。

vector<int>dp(20);
    int n = 20;
    int i = 0;
    while (n--)
    {
        dp[i] = 1;//最好是采用这种方式,避免频繁的数据拷贝
        i++;
        cout << "当前使用的大小:" << dp.size()<<"  " << "总容量大小:" << dp.capacity() << endl;
    }

结果:没有发生扩容

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当Vector集合的元素数量超过其当前容量时,Vector会自动进行扩容扩容的具体过程如下:首先,Vector会创建一个新的数组,其大小通常是当前容量的两倍。然后,Vector会将原数组的元素复制到新数组。最后,Vector会将新数组设置为其内部的数组。这样,Vector就完成了扩容。\[1\] 在JavaVector的默认初始容量是10。当向一个默认初始容量为10的Vector添加第11个元素时,就会触发扩容机制扩容后,Vector的容量会增加到20。\[1\] 在C++,使用STL标准模板类vector时,可以使用reserve()函数来保证容器的最小容量。当容器的元素数量超过其当前容量时,vector会自动进行扩容扩容的具体过程如下:首先,vector会创建一个新的数组,其大小通常是当前容量的两倍。然后,vector会将原数组的元素复制到新数组。最后,vector会将新数组设置为其内部的数组。这样,vector就完成了扩容。\[2\] 无论是在JavaVector还是在C++vector,它们都会根据需要自动进行扩容,以容纳更多的元素。\[1\]\[2\] #### 引用[.reference_title] - *1* *3* [Vector扩容机制,附源码解释](https://blog.csdn.net/qq_52652488/article/details/126252775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vector扩容](https://blog.csdn.net/qq_60669466/article/details/124061431)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值