reserve和resize的区别

26 篇文章 0 订阅
1:存储空间重分配的问题:
我们知道存储空间分配的问题起源于容器对象的动态创建和连续存储的特性;因此只有连续存储的容器才可能需要运行时的存储空间分配;
典型就是vector,其他连续存储容器也会部分地需要存储空间冲分配;
第一种:如vector,其元素保存在连续的存储的空间上,当向该vector中插入一个新元素时,必须保持新的容器仍然满足元素连续存储的条件;这时候就要重新分配存储空间,平且把所有的元素都拷贝新开辟的空间里,然后释放原来的存储空间。
第二种:vector当前预留容量足够带插入的新元素,不需要进行存储空间的重分配。
2:存储空间重分配带来巨大的开销那么如何解决内存重分配的问题呢?

顺序容器vector和string都可以用reverse()和resize()来预留空间或者是调整他们的大小,前面迭代器我们知道reverse()用来保留容量,而resize()用来调整容器大小(size,有效元素的个数),而且有的时候也会调整容器的容量。


start和finsh之间的元素就是容器有效的元素,而strat和end_of_storage之间的空间就是总容量。finsh和end_of_storage之间的空间就是冗余空间,未被初始化。冗余空间不属于容器。
size_t capacity()const
{
 return (end_of_storage- start);
}
size_t size() const
{
retuen (finsh-strat);
}
3:我们观察resserve()函数到底做了些什么?
void reserve()(size_t n)
n表示请求保留总容量的大小
(1)n>capacity(),则需要在自由内存区重新分配一块新的更大的空间,大小是n*sizeof(T),然后将容器内的有效元素拷贝到新的空间(调拷贝构造函数),最后释放旧的空间,并调整容器对象的元素(三个指针指向相应的位置),也就是说如果请求的容量比原有的容量大,容器的冗余容量会变大(end_of_storage指针的位置发生变化)容器本身的大小没有变化
(2)否则,什么都不做

4:reszie()函数


原型 void resize(size_t n,const T&x =T())
调整容器的大小(size),有时也会扩大容器的大小,而且是把容器有效元素的个数调整为用户指定的个数;
(1)n>当前容器的大小size(),则在容器的末尾插入n-size()个初值为x的元素,如果没有则用元素默认的构造函数来初始化每一个新元素;
(2)n<当前容器的大小size(),则从容器的末尾删除size()-n个元素,但不释放元素本身的内存空间,因此容量不变;
(3)否则什么不做;
vector迭代器的实现http://blog.csdn.net/f2016913/article/details/60780189

list迭代器的实现http://blog.csdn.net/f2016913/article/details/58585085

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值