23062C++&QTday7

发布于:2023-09-15 ⋅ 阅读:(78) ⋅ 点赞:(0)

 仿照vector手动实现自己的myVector

代码:

#include <iostream>
#define MAX 128
using namespace std;

template<typename T>
class myVector
{
private:
    int num;
    T val;
    T *data;              //数据域
    int V_size=MAX;
public:
    myVector():data(new T[MAX]),num(0){}           //无参构造
    myVector(int a,T b):num(a),val(b),data(new T[MAX])  //有参构造
    {
        //二倍扩容判断
        if(a>V_size)
        {
            V_size*=2;
            T *newdata=new T[V_size];
            for(int i=0;i<num;i++)
                newdata[i]=data[i];
            delete[] data;
            data=newdata;
        }
        for(int i=0;i<a;i++)
        {
            data[i]=b;
        }
    }
    ~myVector()         //析构函数
    {
        delete[] data;
        data=NULL;
    }
    // 定义迭代器类
        class MyIterator {
        private:
            T* ptr;
        public:
            //有参构造
            MyIterator(T* p):ptr(p){}
            // *重载
            T& operator*()const {
                return *ptr;
            }
            // 前置++重载
            MyIterator& operator++() {
                ++ptr;
                return *this;
            }
            // 后置++重载
            MyIterator operator++(int) {
                MyIterator temp = *this;
                ++ptr;
                return temp;
            }
            // 前置--重载
            MyIterator& operator--() {
                --ptr;
                return *this;
            }
            // 后置--重载
            MyIterator operator--(int) {
                MyIterator temp = *this;
                --ptr;
                return temp;
            }
            // ==重载
            bool operator==(const MyIterator& other) const {
                return ptr == other.ptr;
            }
            // !=重载
            bool operator!=(const MyIterator& other) const {
                return ptr != other.ptr;
            }
        };

    //empty函数
    bool my_empty()
    {
        if(num==0)
            return true;
        return false;
    }
    //assign函数
    void my_assign(int num,T val)
    {
        delete data;
        for(int i=0;i<num;i++)
        {
            data[i]=val;
        }
    }
    //at函数
    T & my_at(int i)
    {
        if(i<0||i>=num)
            throw int(1);
        return data[i];
    }
    //front函数
    T & my_front()
    {
        return data[0];
    }
    //back函数
    T & my_back()
    {
        return data[num-1];
    }

    //erase函数
    MyIterator my_erase(MyIterator loc)
    {
        for(int i=loc;i<num-1;i++)
            data[i]=data[i+1];
        num--;
    }
    //insert函数
    MyIterator my_insert(MyIterator loc,const T n)
    {
        //二倍扩容判断
        if(num==V_size)
        {
            V_size*=2;
            T *newdata=new T[V_size];
            for(int i=0;i<num;i++)
                newdata[i]=data[i];
            delete[] data;
            data=newdata;
        }
        for(int i=num;i>loc-1;i--)
            data[i]=data[i-1];
        data[loc]=n;
        num++;
    }
    //begin函数
    MyIterator  my_begin()
    {
        return MyIterator(data);
    }
    //end函数
    MyIterator  my_end()
    {
        return MyIterator(data+num-1);
    }
    //push_back函数
    void push_back(const T &val)
    {
        //二倍扩容判断
        if(num==V_size)
        {
            V_size*=2;
            T *newdata=new T[V_size];
            for(int i=0;i<num;i++)
                newdata[i]=data[i];
            delete[] data;
            data=newdata;
        }
        data[num]=val;
        num++;
    }
    //pop_back函数
    void pop_back()
    {
        if(my_empty())
            return;
        num--;
    }
    //size函数
    size_t my_size()
    {
        return num;
    }
    //max_size函数
    size_t my_max_size()
    {
        return V_size;
    }
    //swap函数
    void my_swap(myVector &from)
    {
        myVector temp=this;
        this=from;
        from=this;
    }


};

int main()
{
    myVector<int>S1(5,10);
    cout<<S1.my_at(2)<<endl;
    S1.pop_back();
    S1.push_back(20);
    cout<<S1.my_back()<<endl;
    cout<<*S1.my_begin()<<endl;
    cout<<S1.my_size()<<endl;
    cout<<S1.my_max_size()<<endl;
    return 0;
}

运行结果:

思维导图

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到