C++11 STL之vector实现深入剖析(上)

概述

        vector是一种线性容器,因此它的所有成员都是按照严格的线性排序。Vector是通过动态数组来实现的,因此它的成员都是存放在连续的内存中。所以我们不仅可以通过迭代器去遍历成员,还可以通过成员的指针加偏移来访问。因此vector擅长

  1. 通过下标来索引单个成员
  2. 任意顺序迭代访问所有成员
  3. 从尾部追加或删除成员

类图

        首先我们来看下vector的类图,为了便于分析,将只给出接下来将要讲解的接口。首先vector继承于_Vector_base。_Vector_base只做了部分基础接口的包装,如申请与释放内存。_Vector_base有个负责实现的成员_Vector_impl,它有三个重要的成员。分别是_M_start, _M_finish, _M_end_of_storage;记录着vector的内存起始,使用,结束。而_Vector_impl实现最终继承自new_allocator。这是vector的默认内存分配器。new_allocator的实现是对于new与delete的简单包装,提供以vector存储对象类型为单位的内存申请,释放。对象的构造与析构能力。

       __alloc_traits是一个统一的标准内存分配器的接口。它向上提供统一的接口,以隐藏各种分配器的实现细节。学习过设计模式的同学,脑中肯定会不由自主的想到策略模式。

                 

实现

        我们首先来看下size与capacity接口,capacity是返回vector的容量大小。首先_M_start到_M_finish之间的是已使用的内存,也就是size返回值。_M_finish到_M_end_of_storage是容量剩余大小。vector可以理解为记录使用情况的动态数组。

      

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值