您的位置:首页 > 编程语言 > C语言/C++

c++自定义一个动态数组vector

2017-08-20 11:37 239 查看
一、前言

 探索c++中vector容器和模板类的使用,本文使用的是codeblock。

二、

  1.新建class Myvector

   在codeblock上方new —>new class

   




创建好类了,首先添加模板 template <typename T>



这里说一下模板的作用模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。也就是讲是一个预定义的类型当入参的时候才确定实际是什么类型,就相当于java里面的放泛型

vector的底层实现实际上就是一个数组,所以我们要定义一个该模板的数组

既然是数组,那么还需要一个整形sizes记录数组当前大小,改写初始化函数设置初始化数组长度为10,定义多一个整型capacity存放当前数组最长长度。写析构函数,当类销毁的时候销毁初始化的数组。



现在基本的东西都有了,vector有push_blacks(T element);把元素插进数组

当当前数组的大小小于当前最长长度的时候可以直接插入 data[sizes++]=element;

但是当前数组大小大于或等于最长长度的时候就要把数组扩充了,因为我们定义的vector是一个动态数组所以我们要实现扩充。

假设我们每次扩充的长度是原来长度的2倍设置一个函数resizes()该函数为静态数组重新申请空间



现在写resizes方法,我们把resizes定义为一个私有的方法。他的参数是新的最长长度所以要申请 T* newdata = new T[newcapacity];把原来数组的数据复制过去 for(int i=0;i<sizes;i++) newdata[i]=data[i]; 之后就可以把原来的数组删除了再重新设置新的最长长度



这个时候插入元素的方法就好了,我们在加入一个新的方法pop_blcaks(),把数组最后的元素输出并且删除掉。



现在就有一个问题了既然我们增大到一定程度的时候我们可以扩充数组,那么我们删除一定元素的时候也应该缩减数组吧,现在我们改写pop方法



这个时候就有了一个问题了,当sizes一直在cpapcity左右的时候一直重复着插入删除插入删除的时候就会出现复杂度震荡了。

比如当sizes是10的时候capacity是10这个时候就增加一倍时间复杂度是O(n),如果删除sizes是11capacity是20时间复杂度是O(n)一直重复这个插入删除的动作就会吧原来时间复杂度为O(1)的方法变成了O(n)这就叫复杂度震荡。所有我们要消除这个复杂度震荡。当size等于capacity的4分之一的时候才缩减数组就能避免这个复杂度震荡了。



重定义[]运算符,使得其返回数组下标的元素。



三、试验

 


结果:



全部代码:

#ifndef MYVECTOR_H

#define MYVECTOR_H

template <typename T>

class MyVector

{

    private:

        T* data;//底层实现

        int sizes;//当前数组大小

        int capaity;//当前数组最长长度

        //重新分配空间

        void resizes(int newcapacity){

           T* newdata=new T[newcapacity];

           for(int i=0;i<sizes;i++){

            newdata[i]=data[i];

           }

           delete[] data;

           data=newdata;

           capaity=newcapacity;

        }

    public:

        MyVector() {

          data=new T[10];

          capaity=10;

          sizes=0;

        }

        ~MyVector() {

          delete[] data;//释放空间

        }

        //插入新的元素

        void push_backs(T element){

          if(sizes==capaity){

            resizes(2*capaity);

          }

          data[sizes++]=element;

        }

        //弹出最后的元素

        T pop_backs(){

          if(sizes>0){

             sizes=sizes-1;

             T ret = data[sizes];//记录要返回的数

             if(sizes==capaity/4){

                resizes(capaity/2);//复用重新设置数组方法

             }

             return ret;

          }

        }

        T &operator[](int i)

        {

            if(i>=sizes){

                return data[0];

            }

           return data[i];

        }

    protected:

};

#endif // MYVECTOR_H
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: