STL的vector容器的扩容机制

根据小编之前讲解的vector容器,我们都知道了容器vector的底层实现原理是一维数组,也就是说在定义一个vector容器的时候,默认构造函数就已经给容器一个默认的容量了,然后在我们的开发中使用的push_back(val)添加元素,一旦发现容器的容量不足,那么就会触发容器的扩容机制,扩容机制的流程是:

先申请内存——将原本的容量变成原来的n倍——将原本容器中的数据拷贝到新的容器中——释放原来的空间——将数组指针指向新的容器空间

现在让我们徒手来实现一下vector容器:

#ifndef _VECTOR_H_
#define _VECTOR_H_
​
#include <iostream>
using namespace std;
​
// 创建模板类
#define VECTOR_BASE_SIZE 5 // 默认基础容量
#define INC_BASE         2 // 默认扩容倍数
​
template <class T>
class Vector {
public:
// 常见的vector构造函数
    Vector()
    : _cap(VECTOR_BASE_SIZE), _size(0) 
    {
        _arr = new T[VECTOR_BASE_SIZE];
    }
    Vector(int cap)
    : _cap(cap), _size(0) 
    {
        _arr = new T[cap];
    }
​
    Vector(int cap, T e) 
    : _cap(cap), _size(0) 
    {
        _arr = new T[cap];
        for (int i = 0; i < cap; i++) 
            _arr[i] = e;
    }
​
  ~Vector() 
    {
        if (_arr) {
            delete[] _arr;
            _arr = nullptr;
        }
        _cap = 0;
        _size = 0;
    }
​
// 向尾部插入元素
    void push_back(T e)
{
        // 先要判断当前的存储数量是不是已经到达容器容量
        if (_cap == _size) // 已经到达最大容量了,需要进行扩容
        { 
            // 开辟一块新的内存,原来的元素拷贝过去
            T *new_arr = new T[_cap * 2];
            for (int i = 0; i < _cap; i++) 
                new_arr[i] = _arr[i];
            // 释放原来那块内存,重新指向
            delete[] _arr;
            _arr = new_arr;
            _cap *= 2;
        }
        // 插入最后
        _arr[_size++] = e;
    }
​
// 删除尾部元素
    void pop_back()
{
        if (_size) // 有元素,让下标减1
            _size--;
    }
​
// 获取尾部元素
    T back()
{
        if (_size)
            return _arr[_size - 1];
    }
​
// 获取头部元素
    T front()
{
        if (_size)
            return _arr[0];
    } 
​
// 重载下标运算符
  T operator [](int idx)
  {
      if (idx >= _size || idx < 0) // 非法下标,不允许访问,返回相关出错信息
      {
          cout << "This index invalid.Return arguement idx." << endl;
          return idx;
      }
      return _arr[idx];
  }
​
// 获取容量和已存储数量
    int size() const 
{
        return _size;
    }
    int capacity() const
{
        return _cap;
    }
​
private:
    T* _arr;
    int _cap;
    int _size;
};
#endif // !_VECTOR_H_
​
​
​
int main() 
{
    Vector<int> vec;
    for (int i = 0; i < 10; i++) {
        vec.push_back(i+1);
        cout << "capacity: " << vec.capacity() << " size: " << vec.size() << endl;
    }
​
    cout << "idx: 5 element: " << vec[5] << endl;
​
    return 0;
}

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三贝勒文子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值