侯捷STL 15. vector深度探索

1. 基本介绍

  • vector 实际上就是一个数组,在数组内存用完的时候就会自动扩充,两倍扩充,找一块内存更大的空间,将数据迁移

  • 其中有三个指针,start、finish、end_of_storage
  • 分别指向 size范围内的起始位置、终止位置以及 capacity 的终止位置

2. G2.9 源码剖析

2.1. vetor

  • G2.9 版本,采用的是 alloc 分配器
  • 由于内部有三个指针,所以 sizeof(vector) 得到的是 12
  • begin()、end() 返回的分别是 start 和 finish,这里的 finish 指向的是存放数据的最后一个元素的下一个位置,符合前闭后开的原则
  • size() 就是 end() - begin() ,即 finish - start
  • capacity() 也是 end_of_storage - begin(),即 end_of_storage - start
  • empty() begin() == end()
  • front() 对 begin() 解引用
  • back() 对 end() - 1 解引用,即 finish 所指向的元素的上一个地址解引用

2.2. push_back()

  • push_back() 先判断是否有空间,如果有空间则直接存放元素
  • 如果空间消耗完了,就利用 insert_aux() 进行扩容
  • 可以发现 insert_aux() 函数在调用的时候又做了一次是否有可用空间的检查,原因是这个函数还会被其他函数调用,有的函数没有做检查就进入到这个函数,所以需要设置检查的程序

  • 如果 oldsize 为 0,那么就给1,其他的就按二倍扩充
  • 利用 allocate 开辟空间,然后把 finish 和 start 设在同一个位置
  • 开始转移原数值
  • 由于这个函数还会被 insert(p,x) 函数调用,所以会有拷贝安插点之后的数据的代码
  • 接下去要释放原来的 vector,并把指针指向新的 vector

2.3. iterator

  • vector 的 iterator 就是 T*,是一个指针,算法提问的时候通过 traits ,进入针对指针的偏特化版本
  • associated type
    • iterator_category random_assess_iterator_tag
    • value_type T
    • difference_type ptrdiff_t
    • pointer T*
    • reference T&

3. G4.9 源码剖析

3.1. vector

  • G4.9版本 要看 sizeof(vector) 就要看它的 data,它本身没有,就去看父类,父类中有一个 impl,impl中又有三个指针,所以 sizeof(vector) 的值是 12,和 G2.9 一样
  • 在 C++ 中 public 继承可以理解为 是一种,比如这里的 impl 的设计,impl 是一种 allocator
  • 这与认知是不符的,这里应该用 private 继承,因为只是为了调用其中的函数,而不是将其归于它子类的一种,如动物的子类——tiger,用 public 继承就较合理,可以理解为 tiger 是动物的一种

3.2. iterator

  • G4.9中,vector 变为 __gnu_cxx::__normal_iterator<pointer,vector>
  • 其中有一个 protect 变量 _M_current,类型是 _Iterator,_Iterator根据推导是 pointer,pointer 又是 Base : : pointer,Base 是 Vector_base<_Tp,Alloc>,所以最终追踪到的是 vector 的父类,父类中 pointer 又是 __gun_cxx : : __zlloc_traits<_Tp_alloc_type> : : pointer, __gun_cxx : : __zlloc_traits<_Tp_alloc_type> 中的 pointer 其实就是 vector 中元素的 _Tp*,和 G2.9 是一样的
  • 所以 __gnu_cxx::__normal_iterator<pointer,vector> 推导出来是 _Tp*

  • 算法如果要提问获得图片中左下角的三个参数,那么萃取器中模板参数就是 T*,他用的就是 T* 偏特化版本
  • 有点舍近求远
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
侯捷STL源码剖析》是一本深入剖析STL源码的经典著作。STL(Standard Template Library)是C++标准模板库的简称,是C++程序员广泛使用的一个重要工具。本书对STL的各个组成部分进行了详细的讲解和解析。 首先,本书以容器为切入点,分析了STL的数据结构和算法。它详细介绍了STL的各种容器,如vector、list、deque、set、map等,以及它们的实现原理和使用方法。对于每种容器,书中都给出了相应的源码分析和示例代码,使读者能够深入了解其内部实现机制。 其次,本书还讲解了STL算法部分。它涵盖了诸多常用的算法,如排序、查找、删除、替换等,以及它们的源码分析和使用示例。通过对这些算法的探讨,读者可以更好地理解STL的设计思想和优秀的性能。 此外,本书还介绍了STL的迭代器和适配器等重要概念。它详细解析了迭代器的各种类型和特性,以及它们在STL中的应用。同时,它还介绍了适配器的原理和使用方法,通过适配器的灵活运用,可以方便地扩展STL的功能。 总之,《侯捷STL源码剖析》通过对STL源码的剖析,帮助读者深入了解STL的设计和实现,使得读者能够更好地应用STL来解决实际问题。同时,它也为读者提供了学习和理解其他C++库的思路和方法。无论是初学者还是有经验的程序员,这本书都是一本值得阅读的重要参考书籍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值