zoukankan      html  css  js  c++  java
  • 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 << "
      ";
       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     
  • 相关阅读:
    Python网络编程学习_Day9
    Python基础知识学习_Day8
    Python基础知识学习_Day7
    Python基础知识学习_Day6
    Python基础知识学习_Day5
    Python基础知识学习_Day4
    Python基础知识学习_Day3
    Python基础知识学习_Day2
    Python基础知识学习_Day1
    如何使用ssh工具便于远程管理
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8651708.html
Copyright © 2011-2022 走看看