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

本文深入剖析C++11 STL中的vector实现,探讨其线性容器特性、内存管理和容量扩展策略。通过类图分析,展示了vector如何通过动态数组实现,并详细解释了size、capacity、push_back等关键操作的内部逻辑,以及placement new在构造对象中的应用。此外,还提到了预分配内存对性能的影响和优化建议。
摘要由CSDN通过智能技术生成

概述

        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可以理解为记录使用情况的动态数组。

      

size_type size() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值