美文网首页
C++实现模板数组

C++实现模板数组

作者: 二进制人类 | 来源:发表于2022-10-26 09:24 被阅读0次

    myarray.hpp

    #ifndef MYARRAY_HPP
    #define MYARRAY_HPP
    #include <iostream>
    #include <string.h>
    using namespace std;
    template<class T>
    class MyArray
    {
        template<typename T1>
        friend ostream& operator<<(ostream &out, MyArray<T1> &ob);
    private:
        T *arr;
        int size;
        int capacity;//容量
    public:
        MyArray();
        MyArray(int capacity);
    
        //指针成员必须实现的函数
        MyArray(const MyArray<T> &ob);
        ~MyArray();
        MyArray& operator=(const MyArray &ob);
    
        //功能函数
        void push_back(T elem);//尾部插入元素
        void pop_back();//尾部删除元素
        T& at(int pos);//取数组的元素
        void sort();//排序
    
    
    };
    
    template<class T>
    MyArray<T>::MyArray()
    {
        size = 0;
        capacity=5;
    
        //获取数组的堆区空间
        arr=new T[capacity];
        //将数组空间 清0
        memset(arr, 0, sizeof(T)*capacity);
    }
    
    template<class T>
    MyArray<T>::MyArray(int capacity)
    {
        size = 0;
        this->capacity=capacity;
    
        //获取数组的堆区空间
        arr=new T[capacity];
        //将数组空间 清0
        memset(arr, 0, sizeof(T)*capacity);
    }
    
    template<class T>
    MyArray<T>::MyArray(const MyArray<T> &ob)
    {
        cout<<"-----------------"<<endl;
        size=ob.size;
        capacity = ob.capacity;
    
        //获取数组的堆区空间
        arr=new T[capacity];
        //将数组空间 清0
        memset(arr, 0, sizeof(T)*capacity);
    
        //将ob数组中元素拷贝过来
        memcpy(arr,ob.arr, sizeof(T)*capacity);
    }
    
    template<class T>
    MyArray<T>::~MyArray()
    {
        if(arr != NULL)
        {
            delete [] arr;
            arr=NULL;
        }
    }
    
    template<class T>
    MyArray<T> &MyArray<T>::operator=(const MyArray &ob)
    {
        //ob2 = ob1;//this代表ob2  ob代表ob1
        //判断ob2是否有指向
        if(arr != NULL)
        {
            delete [] arr;
            arr=NULL;
        }
    
        size = ob.size;
        capacity = ob.capacity;
    
        //获取数组的堆区空间
        arr=new T[capacity];
        //将数组空间 清0
        memset(arr, 0, sizeof(T)*capacity);
    
        //将ob数组中元素拷贝过来
        memcpy(arr,ob.arr, sizeof(T)*capacity);
    
        return *this;
    }
    
    template<class T>
    void MyArray<T>::push_back(T elem)
    {
        //判断容器是否满
        if(size == capacity)
        {
            //扩容器
            T *tmp = new T[2*capacity];
            memset(tmp,0,sizeof(T)*2*capacity);
    
            //将原来的数组数据 拷贝过来
            memcpy(tmp,arr,sizeof(T)*capacity);
    
            //释放原来的空间
            delete [] arr;
    
            //更新arr的指向
            arr = tmp;
    
            //更新容量大小
            capacity = 2*capacity;
        }
    
    
        arr[size] = elem;
        size++;
    
        return;
    }
    
    template<class T>
    void MyArray<T>::pop_back()
    {
        //判断容器是否为空
        if(size == 0)
        {
            cout<<"容器没有元素 不允许删除"<<endl;
            return;
        }
        size--;
        return;
    }
    
    template<class T>
    T &MyArray<T>::at(int pos)
    {
        //判断pos有效性
        if(pos<0 || pos >=size)
        {
            cout<<pos<<"位置不合法"<<endl;
            exit(-1);
        }
    
        return arr[pos];
    }
    
    template<class T>
    void MyArray<T>::sort()
    {
        if(size == 0)
        {
            cout<<"容器为空 不能排序"<<endl;
            return;
        }
    
        int i=0;
        for(i=0;i<size-1;i++)
        {
            int j = 0;
            for(j=0;j<size-i-1;j++)
            {
                if(arr[j] > arr[j+1])
                {
                    T tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1]=tmp;
                }
            }
        }
        return;
    }
    
    #endif // MYARRAY_HPP
    

    main.cpp

    #include <iostream>
    #include <string>
    #include "myarray.hpp"
    using namespace std;
    
    class Person
    {
        friend ostream& operator<<(ostream &out, Person ob);
    private:
        int num;
        string name;
    public:
        Person(){}
        Person(int num, string name)
        {
            this->num = num;
            this->name = name;
        }
        //重载>
        bool operator>(const Person &ob)
        {
            return num>ob.num;
        }
    };
    
    ostream& operator<<(ostream &out, Person ob)
    {
        out<<ob.num<<" "<<ob.name<<" ";
        return out;
    }
    
    template<typename T1>
    ostream& operator<<(ostream &out, MyArray<T1> &ob)
    {
        cout<<ob.size<<endl;
        int i=0;
        for(i=0;i<ob.size;i++)
        {
            out<<ob.arr[i]<<" ";
        }
        out<<endl;
    
        return out;
    }
    int main(int argc, char *argv[])
    {
        MyArray<int> arr1;
        arr1.push_back(20);
        arr1.push_back(30);
        arr1.push_back(50);
        arr1.push_back(10);
        arr1.push_back(40);
        cout<<arr1<<endl;
        arr1.sort();
        cout<<arr1<<endl;
    
        MyArray<Person> arr2;
        arr2.push_back(Person(103,"lucy"));
        arr2.push_back(Person(101,"bob"));
        arr2.push_back(Person(105,"tom"));
        arr2.push_back(Person(104,"Harry"));
    
        cout<<arr2<<endl;
        arr2.sort();
        cout<<arr2<<endl;
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C++实现模板数组

          本文链接:https://www.haomeiwen.com/subject/reqwzrtx.html