实现vector

来源:互联网 发布:淘宝折800报名入口 编辑:程序博客网 时间:2024/06/03 21:28

创建一个自定义的动态数组,用户可以为其分配初始容量,实现过程如下:

//MyVector.h#ifndef MYVECTOR1_H#define MYVECTOR1_H#include <iostream>#include <cassert>template <typename T>class MyVector{private:    int capacity_;    int size_;    T *data;    // O(n)    void resize(int cap){        assert(cap >= size_);        // 开辟新的空间并拷贝元素        T *newData = new T[cap];        for (int i = 0; i < size_; i++){            newData[i] = data[i];        }        // 删掉以前的数据        delete[] data;        // 指向新开辟的空间        data = newData;        capacity_ = cap;    }public:    // 构造函数    MyVector(int capacity) :capacity_(capacity), size_(0){        data = new T[capacity_];    }    MyVector() :MyVector(10){}    ~MyVector(){ delete[] data; }    // 均摊后O(1)    void push_back(T e){        if (size_ == capacity_)            resize(capacity_ * 2);        data[size_++] = e;    }    // 均摊后O(1)    T pop_back(){        assert(size_ > 0);        T ret = data[size_ - 1];        size_--;        // 为了防止复杂度震荡        if (size_ == capacity_ / 4)            resize(capacity_ / 2);        return ret;    }    // 返回大小和容量    int size(){ return size_; }    int capacity(){ return capacity_ };};#endif // MYVECTOR1_H

在vector的实现过程中:

  1. 构造函数可以有默认构造函数,也可以有用户为vector分配容量;

  2. 在push_back操作时,需要判断数组的大小是否达到了最大容量,达到的话再进行插入就要溢出了,此时需要对数组进行resize操作,resize的大小时当前数组容量的两倍。

  3. 同样的,再pop_back的时候也需要考虑容量大小,进而对数组进行resize的情况,值得注意的是,在pop_back时为了防止复杂度震荡,通过判断当前size是否为容量的14,如果是则进行resize,而且resize的大小为容量的12

  4. 在resize过程中需要先新建一个数组,然后将原来的数据拷贝新建的块中,然后再将原来的内存块中的数据删去,然后用原来的指针指向现在新建的内存的数据首地址,最后保存下新的容量。

原创粉丝点击