35.自己实现vector模板库myvector

  • myvector.h
     1 #pragma once
     2 
     3 //自己写的vector模板库
     4 template <class T>
     5 class myvector
     6 {
     7 public:
     8     //构造
     9     myvector();
    10     //析构
    11     ~myvector();
    12     //尾插
    13     void push_back(T t);
    14     //索引
    15     T *find(T t);
    16     //改变
    17     void change(T*pos, T t);
    18     //删除
    19     void del(T t);
    20     //显示
    21     void show();
    22     //重载[]操作符
    23     T operator [](int i);
    24 
    25     //指定位置插入
    26     void insert(T findt, T t);
    27 public:
    28     //数据指针
    29     T *p;
    30     //标记内存长度
    31     int n;
    32     //实际长度
    33     int realn;
    34 };

     

  • myvector.cpp
      1 #include "myvector.h"
      2 
      3 //构造初始化
      4 template <class T>
      5 myvector<T>::myvector()
      6 {
      7     p = nullptr;
      8     n = realn = 0;
      9 }
     10 
     11 //析构函数清空内存
     12 template <class T>
     13 myvector<T>::~myvector()
     14 {
     15     if (p!=nullptr)
     16     {
     17         delete  []p;
     18         p = nullptr;//清空
     19     }
     20 }
     21 
     22 //尾部插入
     23 template <class T>
     24 void myvector<T>::push_back(T t)
     25 {
     26     //如果是空指针
     27     if (p==nullptr)
     28     {
     29         //分配内存
     30         p = new T;
     31         //赋值
     32         *p = t;
     33         //真实的长度和当前长度都赋值为1
     34         realn = n = 1;
     35     } 
     36     else
     37     {
     38         //如果不为空则重新分配内存
     39         T *ptemp = new T[n + 1];
     40         //拷贝到新的空间
     41         for (int i = 0; i < n;i++)
     42         {
     43             *(ptemp + i) = *(p + i);
     44         }
     45         //赋值最后一个元素
     46         *(ptemp + n) = t;
     47         //把原来的空间给删除
     48         delete []p;
     49 
     50         //指向新的空间
     51         p = ptemp;
     52 
     53         //真实长度与预留总长度都加1
     54         realn += 1;
     55         n += 1;
     56     }
     57 }
     58 
     59 //显示数据
     60 template <class T>
     61 void myvector<T>::show()
     62 {
     63     if (p==NULL)
     64     {
     65         return;
     66     }
     67     else
     68     {
     69         //遍历
     70        for (int i = 0; i < realn;i++)
     71        {
     72            cout << p[i] << "  ";
     73        }
     74        cout << "\n";
     75     }
     76 }
     77 
     78 //查询某一个数据
     79 template <class T>
     80 T *  myvector<T>::find(T t)
     81 {
     82     //遍历查询,返回指针位置
     83     for (int i = 0; i < realn; i++)
     84     {
     85         if (t==*(p+i))
     86         {
     87             return p + i;
     88         }
     89     }
     90     return nullptr;
     91 }
     92 
     93 //改变指定位置的数据
     94 template <class T>
     95 void myvector<T>::change(T*pos, T t)
     96 {
     97     //如果位置为空
     98     if (pos==nullptr)
     99     {
    100         return;
    101     }
    102     //如果不为空
    103     else
    104     {
    105         *pos = t;
    106     }
    107 }
    108 
    109 //删除某指定的第一个数据
    110 template <class T>
    111 void myvector<T>::del(T t)
    112 {
    113     //标识有没有找到
    114     int pos = -1;
    115     //遍历查找,如果找到了记录位置
    116     for (int i = 0; i < realn; i++)
    117     {
    118         if (t == *(p + i))
    119         {
    120             pos = i;
    121             break;
    122         }
    123     }
    124     //如果找到
    125     if (pos!=-1)
    126     {
    127         //如果是最后一个元素
    128         if (pos== realn-1)
    129         {
    130             realn -= 1;
    131         }
    132         //如果不是最后一个元素,则向前移动
    133         else 
    134         {
    135             for (int i = pos; i < realn-1;i++)
    136             {
    137                 p[i] = p[i + 1];
    138             }
    139             realn -= 1;
    140         }
    141     }
    142 }
    143 
    144 //插入
    145 template <class T>
    146 void myvector<T>::insert(T findt, T t)
    147 {
    148     //如果预留长度满了
    149     if (n == realn)
    150     {
    151         //找到指定位置
    152         int pos = -1;
    153         for (int i = 0; i < realn; i++)
    154         {
    155             if (findt == *(p + i))
    156             {
    157                 pos = i;
    158                 break;
    159             }
    160         }
    161         //如果找到了
    162         if (pos != -1)
    163         {
    164             //重新分配内存并拷贝
    165             T *ptemp = new T[n + 1];//重新分配内存
    166             for (int i = 0; i < n; i++)
    167             {
    168                 *(ptemp + i) = *(p + i);//拷贝
    169             }
    170             //删除原数据
    171             delete[] p;
    172             //指向新内存
    173             p = ptemp;
    174             //预留长度加1
    175             realn += 1;
    176             //真实长度加1
    177             n += 1;
    178     
    179             //指定位置数据往后移
    180             for (int i = realn - 2; i >= pos; i--)
    181             {
    182                 p[i + 1] = p[i];//往前移动
    183             }
    184             //要插入的位置赋值
    185             p[pos] = t;
    186         }
    187     }
    188     //如果预留的长度没有满,则不用重新分配内存
    189     else
    190     {
    191         //找到指定位置
    192         int pos = -1;
    193         for (int i = 0; i < realn; i++)
    194         {
    195             if (findt == *(p + i))
    196             {
    197                 pos = i;
    198                 break;
    199             }
    200         }
    201         //如果找到了
    202         if (pos != -1)
    203         {
    204             //指定位置数据往后移
    205             for (int i = realn - 1; i >= pos; i--)
    206             {
    207                 p[i + 1] = p[i];
    208 
    209             }
    210             p[pos] = t;
    211             realn += 1;
    212         }
    213     }
    214 }
    215 
    216 //重载[]运算符
    217 template <class T>
    218 T myvector<T>::operator [](int i)
    219 {
    220     if (i < 0 || i>=realn)
    221     {
    222         return NULL;
    223     }
    224     return  p[i];
    225 }

     

  • main.cpp
     1 #include <iostream>
     2 #include<stdlib.h>
     3 #include <vector>
     4 #include <string>
     5 #include "myvector.h"
     6 #include "myvector.cpp"
     7 using namespace std;
     8 
     9 //测试函数
    10 void main()
    11 {
    12     myvector<int> myv1;
    13     myv1.push_back(11);
    14     myv1.push_back(12);
    15     myv1.push_back(13);
    16     myv1.push_back(14);
    17     myv1.push_back(15);
    18     myvector<int> myv2;
    19     myv2.push_back(31);
    20     myv2.push_back(32);
    21     myv2.push_back(33);
    22 
    23     myvector<int> myv3;
    24     myv3.push_back(131);
    25     myv3.push_back(132);
    26     myv3.push_back(133);
    27     myv3.push_back(1337);
    28 
    29     myvector< myvector<int>* > myvv;//自己写的模板嵌套用指针
    30 
    31     myvv.push_back(&myv1);
    32     myvv.push_back(&myv2);
    33     myvv.push_back(&myv3);
    34     myvv[0]->show();
    35     myvv[1]->show();
    36     myvv[2]->show();
    37 
    38     cout << myv1[2] << endl;
    39     cin.get();
    40 
    41 }
    42 
    43 
    44 
    45 
    46 
    47 
    48     

     

posted @ 2018-03-26 16:09  喵小喵~  阅读(547)  评论(0)    收藏  举报