vector容器学习

vector的数据安排和操作方式,和array很相似。但是vector优点是空间的灵活性。array是静态空间,如果我们想要多增加元素,必须手动申请,而vector会自动扩充空间。再也不用担心空间不足申请很大的array.
vector实现关键在于对大小的控制以及重新配置时数据移动效率。如果每次新增一个元素就申请一个元素的空间,那么效率很低。下面我们会学习SGI vector的空间配置策略。

1、vector的迭代器
因为vector维护的是一个连续线性空间,所以普通指针作为迭代器足够满足要求,因为*,++.,–等操作普通指针也具备。vector支持随机存取,普通指针具备这样的能力。所以vector提供的是随机存取迭代器。
在这里插入图片描述
2、vector的数据结构
vector数据结构非常简单:线性连续空间。
以两个迭代器start,finish指向使用的开头和结尾。并以end_of_storage迭代器指向整块连续空间(包括备用空间)的尾端。
在这里插入图片描述
vector的实际配置大小可能比用户要求的大一些,以备将来可能的扩充。这就是容量的概念
在这里插入图片描述
在这里插入图片描述
这里注释要重视,扩充是成倍扩充的,并且扩张必须要重新配置,移动元素,释放源空间等操作。

3、vector的构造和内存管理
我们的动态增加大小,并不是在源空间后续接新空间,因为无法保证原空间后还有空间可以配置。而是以原大小的两倍配置另一块新的较大的空间。然后将原内容拷贝过来,然后再在原内容后配置新元素,原空间释放。这里空间的配置就要用到配置器里面的知识了,这些配置对我们来说是隐形的。
因此,一旦vector重新配置空间,指向原空间的所有迭代器就都失效了,这是我们易发生错误的地方。
总结一下,空间倍增是因为提高效率,防止频繁申请空间。配置新的空间是因为原空间后面不一定有可用的空间了,可能被别的数据占用,而vector必须是连续线性的空间。

4、几个相关的函数操作(pop_back,erase,insert,clear)
在这里插入图片描述

从源代码可以看出,pop_back就是移除最后一个元素,然后将最后一个元素的空间释放。
在这里插入图片描述
从源代码可以明显看出,erase可以用来删除一段元素。实际操作时,first迭代器并不变,是把原来last后面的元素移动到first迭代器指向的地址,然后释放无用的后面那些空间。把finsh指针前移相应的位置。因为要保证vector的连续性。(关于copy的操作后面会说,知道大概啥意思就行)
在这里插入图片描述
erase也可以删除一个元素。
在这里插入图片描述
可以看出clear实际上也是用erase实现的。

insert操作相对复杂一些,因为这可能涉及到空间配置的问题。
在这里插入图片描述
在这里插入图片描述
可以看出insert是可以一次插入多个元素的。说实话我不太理解为什么这里要分成两种情况?可能对源码中的uninitialized_copy的意义了解后才能弄清楚。
在这里插入图片描述
当空间不足时,配置新空间,然后将原数据复制,新增数据复制,最后Position位置之后的元素复制。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值