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 }