35.自己实现vector模板库myvector

时间:2023-03-08 22:47:37
  • myvector.h
     #pragma once
    
     //自己写的vector模板库
    template <class T>
    class myvector
    {
    public:
    //构造
    myvector();
    //析构
    ~myvector();
    //尾插
    void push_back(T t);
    //索引
    T *find(T t);
    //改变
    void change(T*pos, T t);
    //删除
    void del(T t);
    //显示
    void show();
    //重载[]操作符
    T operator [](int i); //指定位置插入
    void insert(T findt, T t);
    public:
    //数据指针
    T *p;
    //标记内存长度
    int n;
    //实际长度
    int realn;
    };
  • myvector.cpp
     #include "myvector.h"
    
     //构造初始化
    template <class T>
    myvector<T>::myvector()
    {
    p = nullptr;
    n = realn = ;
    } //析构函数清空内存
    template <class T>
    myvector<T>::~myvector()
    {
    if (p!=nullptr)
    {
    delete []p;
    p = nullptr;//清空
    }
    } //尾部插入
    template <class T>
    void myvector<T>::push_back(T t)
    {
    //如果是空指针
    if (p==nullptr)
    {
    //分配内存
    p = new T;
    //赋值
    *p = t;
    //真实的长度和当前长度都赋值为1
    realn = n = ;
    }
    else
    {
    //如果不为空则重新分配内存
    T *ptemp = new T[n + ];
    //拷贝到新的空间
    for (int i = ; i < n;i++)
    {
    *(ptemp + i) = *(p + i);
    }
    //赋值最后一个元素
    *(ptemp + n) = t;
    //把原来的空间给删除
    delete []p; //指向新的空间
    p = ptemp; //真实长度与预留总长度都加1
    realn += ;
    n += ;
    }
    } //显示数据
    template <class T>
    void myvector<T>::show()
    {
    if (p==NULL)
    {
    return;
    }
    else
    {
    //遍历
    for (int i = ; i < realn;i++)
    {
    cout << p[i] << " ";
    }
    cout << "\n";
    }
    } //查询某一个数据
    template <class T>
    T * myvector<T>::find(T t)
    {
    //遍历查询,返回指针位置
    for (int i = ; i < realn; i++)
    {
    if (t==*(p+i))
    {
    return p + i;
    }
    }
    return nullptr;
    } //改变指定位置的数据
    template <class T>
    void myvector<T>::change(T*pos, T t)
    {
    //如果位置为空
    if (pos==nullptr)
    {
    return;
    }
    //如果不为空
    else
    {
    *pos = t;
    }
    } //删除某指定的第一个数据
    template <class T>
    void myvector<T>::del(T t)
    {
    //标识有没有找到
    int pos = -;
    //遍历查找,如果找到了记录位置
    for (int i = ; i < realn; i++)
    {
    if (t == *(p + i))
    {
    pos = i;
    break;
    }
    }
    //如果找到
    if (pos!=-)
    {
    //如果是最后一个元素
    if (pos== realn-)
    {
    realn -= ;
    }
    //如果不是最后一个元素,则向前移动
    else
    {
    for (int i = pos; i < realn-;i++)
    {
    p[i] = p[i + ];
    }
    realn -= ;
    }
    }
    } //插入
    template <class T>
    void myvector<T>::insert(T findt, T t)
    {
    //如果预留长度满了
    if (n == realn)
    {
    //找到指定位置
    int pos = -;
    for (int i = ; i < realn; i++)
    {
    if (findt == *(p + i))
    {
    pos = i;
    break;
    }
    }
    //如果找到了
    if (pos != -)
    {
    //重新分配内存并拷贝
    T *ptemp = new T[n + ];//重新分配内存
    for (int i = ; i < n; i++)
    {
    *(ptemp + i) = *(p + i);//拷贝
    }
    //删除原数据
    delete[] p;
    //指向新内存
    p = ptemp;
    //预留长度加1
    realn += ;
    //真实长度加1
    n += ; //指定位置数据往后移
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i];//往前移动
    }
    //要插入的位置赋值
    p[pos] = t;
    }
    }
    //如果预留的长度没有满,则不用重新分配内存
    else
    {
    //找到指定位置
    int pos = -;
    for (int i = ; i < realn; i++)
    {
    if (findt == *(p + i))
    {
    pos = i;
    break;
    }
    }
    //如果找到了
    if (pos != -)
    {
    //指定位置数据往后移
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i]; }
    p[pos] = t;
    realn += ;
    }
    }
    } //重载[]运算符
    template <class T>
    T myvector<T>::operator [](int i)
    {
    if (i < || i>=realn)
    {
    return NULL;
    }
    return p[i];
    }
  • main.cpp
     #include <iostream>
    #include<stdlib.h>
    #include <vector>
    #include <string>
    #include "myvector.h"
    #include "myvector.cpp"
    using namespace std; //测试函数
    void main()
    {
    myvector<int> myv1;
    myv1.push_back();
    myv1.push_back();
    myv1.push_back();
    myv1.push_back();
    myv1.push_back();
    myvector<int> myv2;
    myv2.push_back();
    myv2.push_back();
    myv2.push_back(); myvector<int> myv3;
    myv3.push_back();
    myv3.push_back();
    myv3.push_back();
    myv3.push_back(); myvector< myvector<int>* > myvv;//自己写的模板嵌套用指针 myvv.push_back(&myv1);
    myvv.push_back(&myv2);
    myvv.push_back(&myv3);
    myvv[]->show();
    myvv[]->show();
    myvv[]->show(); cout << myv1[] << endl;
    cin.get(); }