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 }