vector扩容原理

博客介绍了vector使用连续内存空间,未提前设定大小时,push_back会重新开辟空间、拷贝元素,导致时间复杂度高且迭代器失效。阐述了reserve和resize可预留空间,减少内存开辟和迭代器失效次数,并详细说明了二者的区别和共同点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载原文地址:

https://blog.youkuaiyun.com/yangshiziping/article/details/52550291

关于vector,始终记住它必须使用的连续空间的一片内存:

在push_back的过程中,如果采用的方式是:

vector<int>v;

v.push_back(1);

 std::vector<int>::iterator iter1 = v.begin();
 v.push_back(2);

  v.push_back(3);

  v.push_back(4);

  v.push_back(5);

一开始没有设定好vector的大小,每来一个元素,就意味着会重新开辟空间,拷贝元素,这样不仅仅时间复杂度上很高。而且在重新开辟空间之后,原来的指向第一个元素的迭代器,也就是那个指针无法使用了。

这时reserve函数的作用就体现出来了,如果一开始预留的空间足够大,也就是capacity足够使用,那么在这个过程中,不用重新开辟空间,这样原来的迭代器还可以使用,这就是reserve的作用。

所以

避免内存重新配置的方法(尽量避免迭代器的失效)
可以使用Reserve()保留适当容量
       在创建容器后,第一时间为容器分配足够大的空间,避免重新分配内存。

    std::vector<int> v;//create an empty vector
    v.reserve(80);// reserve memory for 80 elements

这样在pushback的过程中,在不超过capacity之前,都不需要重新开辟空间,迭代器都不会失效。

同时也可以使用resize的方法为接下来的数据预留空间,只不过使用resize会使得capacity变得比当前的size更大。

下面说一下关于reserve和resize之间的区别:

在前面如果说使用reserve(10)

将容器的大小设置成10

那么之后每次push_back的过程中,在数量小于10的情况下,不会去重新开辟内存空间,然后进行数据的拷贝等等操作。

减少内存拷贝的复杂,和迭代器的失效等问题

如果说设置成resize,此时空间size为10,且capacity为10,并且里面被填充上了0,

即使之后push_back(1),这时因为capacity已经满了,此时还是需要重新开辟内存空间,之前的迭代器失效

那么此时设置resize的目的在哪呢?因为此时再次开辟空间的时候,因为有一个基数10在那,所以在进行空间开辟的时候,之间去另一个内存空间处,开辟出15大小的capacity。这样在接着进行push_back的过程中,就可以减少空间的开辟次数。

reserve和resize之间的区别:

1.reserve是开辟一段空的空间,push_back的过程中直接往里面插入数据,设置的大小就是capacity的大小

2.resize是开辟一段空间,但是全部填充元素0,push_back是在后面接着添加,但是不可避免的是,第一步就要重新开辟空间,而resize的初始值的意义只是有一个基数在那,使得capacity无论是以1.5还是2倍都会减少内存开辟的次数

共同点:

都可以用来一开始的空间预留,减少内存开辟的次数,和迭代器失效的次数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值