STL之vector扩容机制

6 篇文章 0 订阅

一、背景介绍

vector作为STL的常用容器之一,其特性和数组类似,拥有一段连续的内存空间。vector申请的是一段连续的内存,当插入新的元素内存不够时,通常会再重新申请更大的一块内存,将原来的元素拷贝过去,释放旧空间。因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为O(n)。

二、相关函数介绍

2.1 resize()

resize,即重置容器空间。当设置值小于当前容器空间时,会将目前容器中超出设置值的空间释放掉;当设置值大于当前容器空间时,会在当前空间的基础上增加容量。
举个例子,vector当前容量为10,若使用resize(20)设置容量为20,则需要再扩容增加10个;若使用resize(5)设置容量为5,则将6-10的空间进行释放。
空口无凭,咱直接上g++5.2源码:

      void
      resize(size_type __new_size)
      {
		if (__new_size > size()) 
		  _M_default_append(__new_size - size());
		else if (__new_size < size())
		  _M_erase_at_end(this->_M_impl._M_start + __new_size);
      }

2.2 reserve()

reserve,即预留容器空间。当设置值大于当前容器空间时,会增加当前容器空间的大小,源码如下:

    void
    reserve(size_type __n)
    {
      if (__n > max_size())
	__throw_length_error(__N("vector::reserve"));
      if (capacity() < __n)
	_M_reallocate(__n);
    }

三、扩容机制(1.5倍还是2.0倍?)

下面将在msvc编译器和gcc编译器上分别测试,直接上代码:

#include <iostream>
#include <vector>

using namespace std;

int main(){
    vector<int> dp;
    int n = 100;
    while (n--) {
        dp.push_back(n);
        cout << "size " << dp.size() << ", capacity " << dp.capacity() << endl;
    }
}

3.1 MSVC执行结果

在这里插入图片描述

3.2 GCC执行结果

在这里插入图片描述

3.3 总结

显然,不同编译器在vector的扩容策略上显然不太一致,在vector的size()(当前容器所用空间)等于capacity()(当前容器总空间)时会发生扩容,msvc编译器每次是以1.5倍且向下取整的策略进行扩容,gcc编译器则是每次以2.0倍的策略进行扩容。

无论如何,在vector的日常使用中,如果只是简单的push_back插入数据,显然会带来频繁的数据拷贝,这对程序执行效率来说影响很大,因此,在能提前考虑容量的情况下,提前使用**reserve()resize()**调整容器空间对程序性能提升很有意义。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 当Vector集合的元素数量超过其当前容量时,Vector会自动进行扩容。扩容的具体过程如下:首先,Vector会创建一个新的数组,其大小通常是当前容量的两倍。然后,Vector会将原数组中的元素复制到新数组中。最后,Vector会将新数组设置为其内部的数组。这样,Vector就完成了扩容。\[1\] 在Java中,Vector的默认初始容量是10。当向一个默认初始容量为10的Vector中添加第11个元素时,就会触发扩容机制。扩容后,Vector容量会增加到20。\[1\] 在C++中,使用STL标准模板类vector时,可以使用reserve()函数来保证容器的最小容量。当容器的元素数量超过其当前容量时,vector会自动进行扩容。扩容的具体过程如下:首先,vector会创建一个新的数组,其大小通常是当前容量的两倍。然后,vector会将原数组中的元素复制到新数组中。最后,vector会将新数组设置为其内部的数组。这样,vector就完成了扩容。\[2\] 无论是在Java中的Vector还是在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
发出的红包

打赏作者

阿杰的小鱼塘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值