博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
35.自己实现vector模板库myvector
阅读量:5019 次
发布时间:2019-06-12

本文共 4685 字,大约阅读时间需要 15 分钟。

  • myvector.h
    1 #pragma once 2  3 //自己写的vector模板库 4 template 
    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 
    5 myvector
    ::myvector() 6 { 7 p = nullptr; 8 n = realn = 0; 9 } 10 11 //析构函数清空内存 12 template
    13 myvector
    ::~myvector() 14 { 15 if (p!=nullptr) 16 { 17 delete []p; 18 p = nullptr;//清空 19 } 20 } 21 22 //尾部插入 23 template
    24 void myvector
    ::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
    61 void myvector
    ::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
    80 T * myvector
    ::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
    95 void myvector
    ::change(T*pos, T t) 96 { 97 //如果位置为空 98 if (pos==nullptr) 99 {100 return;101 }102 //如果不为空103 else104 {105 *pos = t;106 }107 }108 109 //删除某指定的第一个数据110 template
    111 void myvector
    ::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
    146 void myvector
    ::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 //预留长度加1175 realn += 1;176 //真实长度加1177 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 else190 {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
    218 T myvector
    ::operator [](int i)219 {220 if (i < 0 || i>=realn)221 {222 return NULL;223 }224 return p[i];225 }

     

  • main.cpp
    1 #include 
    2 #include
    3 #include
    4 #include
    5 #include "myvector.h" 6 #include "myvector.cpp" 7 using namespace std; 8 9 //测试函数10 void main()11 {12 myvector
    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
    myv2;19 myv2.push_back(31);20 myv2.push_back(32);21 myv2.push_back(33);22 23 myvector
    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
    * > 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

     

转载于:https://www.cnblogs.com/xiaochi/p/8651708.html

你可能感兴趣的文章
merge-two-sorted-lists
查看>>
归并排序法
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
display:flow-root
查看>>
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
Codeforces Round #327 (Div. 2)
查看>>
How to install ia32-libs in Ubuntu 14.04 LTS (Trusty Tahr)
查看>>
The Ctrl & CapsLock `problem'
查看>>
Makefile ===> Makefile 快速学习
查看>>
cmake使用
查看>>
Bitwise And Queries
查看>>
Amd,Cmd, Commonjs, ES6 import/export的异同点
查看>>
14.精益敏捷项目管理——认识精益笔记
查看>>
从0开始实现STM32L4XX输出50Hz方波
查看>>
caffe mnist LeNet 参数详细介绍
查看>>