介绍

  • 主要使用数组实现了Vector中push_back和pop_back的操作
  • 若一直push_back造成越界,自动设置一个更大的的数组来存放当前数据
  • 若一直pop_back造被浪费的内存过多,自动设置一个更小的数组来存放当前数据
  • 利用均摊复杂度防止在越界边缘连续pop和push频繁resize产生复杂度的震荡

代码实现

MyVector.h

#ifndef MYVECTOR_H
#define MYVECTOR_H
#include <assert.h>

template <typename T>
class MyVector
{
private:
    T* data;        //存放数据的数组
    int capacity;   //容量
    int size;       //储存数组中的元素个数
  
    //重新设置新的数组
    //使用均摊复杂度来降低平均的复杂度
    void resize(int newCapactiry)
    {
        assert(newCapactiry >= size);
        T* newData = new T[newCapactiry];
        //将老的数据存到新开的数组中
        for(int i = 0; i < size; i++)
        {
            newData[i] = data[i];
        }
        delete[] data;
        data = newData;
        capacity = newCapactiry;
    }
public:
    MyVector()
    {
        data = new T[10];
        capacity = 10;
        size = 0;
    }
    ~MyVector()
    {
        delete[] data;
    }
  
    //平均复杂度为O(1)
    void push_back(T e)
    {
        if(size == capacity)
        {
            resize(2*capacity);
        }
        assert(size < capacity);
        data[size++] = e;
    }
  
    //平均复杂度为O(1)
    T pop_back()
    {
        assert(size > 0);
        T ret = data[size];
        size --;
        //防止连续pop和push产生复杂度的震荡
        if(size == capacity/4)
        {
            resize(capacity/2);
        }
        return ret;
    }

};

#endif

MyVector.cpp(测试)

#include <iostream>
#include <cmath>
#include "MyVector.h"
using namespace std;
int main()
{
    for(int i = 10; i <= 26; i++)
    {
        int n = pow(2,i);
        clock_t startTime = clock();
        MyVector<int> vec;
        for(int i = 0; i < n; i++)
        {
            vec.push_back(i);
        }
        for(int i = 0; i < n; i++)
        {
            vec.pop_back();
        }
        clock_t endTime = clock();
  
        cout<<2*n<<" operations:\t";
        cout<<double(endTime - startTime)/CLOCKS_PER_SEC<<"s"<<endl;
    }
    return 0;
}

更多C++知识

https://github.com/lengyueling/AlgorithmStudy