码迷,mamicode.com
首页 > 其他好文 > 详细

vector内部实现2

时间:2019-08-27 12:37:03      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:assign   set   struct   要求   注意   位置   不可   入栈   clear   

push_back 往动态数组的内部进行添加数据

pop_back 往动态数组的尾部进行删除数据

resize  讲元素的数量len改成num个数量  如果size()变大了,多出来的将用默认构造来创建

assert(nullptr);断言函数 可以解决出错问题 和return,throw相似 进行处理异常数据

reserve(int n);如果容器的容量不足扩大容量

maxSize=maxSize+(maxSize>>1)>1?(maxSize>>1):1)  内存不够会发生内存重分配 把原来的内存数据拷贝到新的内存中去

1 2 3 4 6 9 13 19

vector<int>::iterator vit;容器的迭代器

迭代器 是用来遍历容器中部分或者全部容器的对象

结构和类的区分 访问权限不是主要的区分方式 对象中有接口用类 对象里面没有接口就用结构 迭代器用结构来模拟

.h文件不参与编译 只是一个工具 

end和begin是指向vertor里面容器的开始和结尾 insert和erase是插入和删除

自己模拟的动态数组在元素删除时不会有内存重分配,但是系统vector在删除时候回导致内存重分配

具体内容由下面实现

  1 #pragma once
  2 template<typename T>
  3 class Myvector
  4 {
  5     T *pBuff;//给一个指针用来指向以恶个动态内存
  6     unsigned int len;//给一个长度 表示这个内存中的元素个数
  7     size_t maxSize;//存放这个动态数组的内存空间的大小
  8 public:
  9     struct MyIterator//这个结构也是一个模板 一个模板内部嵌套定义了一个末班
 10     {
 11         T *pIt;
 12         MyIterator & operator = (MyIterator const& srcIt)
 13         {
 14             pIt=srcIt.pIt;
 15             return *this;
 16         }
 17         bool operator!=(MyIterator const& srcIt) const
 18         {
 19             return pIt!=srcIt.pIt;        
 20         }
 21         MyIterator & operator ++ ()//前置
 22         {
 23             pIt++;
 24             return *this;
 25         }    
 26         MyIterator  operator++ (int)//后置++
 27         {
 28             MyIterator tempIt=*this;
 29             pIt++;
 30             return tempIt;
 31         }
 32         T &operator*()
 33         {
 34             return *pIt;
 35         }
 36         T &operator-(MyIterator const& scrIt)const
 37         {
 38             return pIt-scrIt.pIt;
 39         }
 40         MyIterator operator +(int n)
 41         {
 42             MyIterator tempIt = *this;
 43             tempIt.pIt+=n;
 44             return tempIt;
 45         }
 46     };
 47 public:
 48     MyIterator begin()//得到容器的第一个位置
 49     {
 50         MyIterator tempIt;
 51         tempIt.pIt=pBuff;
 52         return templt;
 53     }
 54     MyIterator end()//得到容器的最后一个元素的下一个位置
 55     {
 56         MyIterator tempIt;
 57         tempIt.pIt=pBuff+len;
 58         return tempIt;
 59     }
 60 public:
 61     MyIterator insert(MyIterator const& pos,MyIterator const& firstMyIterator const& second)//插入,在pos处插入n个elem元素
 62     {
 63         MyIterator tempIt=pos;
 64         int n=second-first;
 65                 for(int i=o;i<n;i++)
 66             tempIt=insett(templt,*(first+i));//在insert里面调用重载的另一个insert
 67         return tempIt;
 68     }
 69     MyIterator insert(MyIterator const& pos,int n,T const& elem)//插入,在pos处插入n个elem元素
 70     {
 71         MyIterator tempIt=pos;
 72         for(int i=o;i<n;i++)
 73             tempIt=insett(templt,elem);//在insert里面调用重载的另一个insert
 74         return tempIt;
 75     }
 76     MyIterator insert(MyIterator const& pos,T const& elem)//插入,在pos这个股迭代器所指的位置插入一个elem元素
 77     {
 78         int index=pos.pIt-pBuff;//通过迭代器位置和容器的首地址进行相减 得到当前的下标
 79         if(len>=maxSize)
 80         {
 81         maxSize=maxSize+(maxSize>>1)>1?(maxSize>>1):1);
 82         T *tempBuff=new T[maxSize];
 83         for(size_t i=0;i<len;++i)
 84             tempBuff[i]=pBuff[i];
 85         if(pBuff!=nullptr)
 86             delete[] pBuff;
 87         pBuff=tempBuff;
 88         }
 89         //移位操作
 90         for(size_t i=len;i>index;--i)
 91         {
 92             pBuff[i]=pBuff[i-1];
 93         }
 94         pBuff[index]=elem;
 95         len++;
 96         Myterator tempIt;
 97         tempIt.pIt=pBuff+index;
 98         return tempIt;
 99     }
100     //注意:自己模拟的动态数组在元素删除时不会有内存重分配,但是系统vector在删除时候回导致内存重分配
101     MyIterator erase(MyIterator const& pos)//删除代码
102     {
103         int index=pos.pIt-pBuff;
104         for(sieze_t i=index;i<len-1;i++)
105         {
106             pBuff[i]=pBuff[i+1];
107         }
108         len--;
109         Myterator tempIt;
110         tempIt.pIt=pBuff+index;
111         return tempIt;
112     }
113     MyIterator erase(MyIterator const& firstMyIterator const& second)
114     {
115         int n=second-first;
116         MyIterator tempIt=first;
117         for(int i=0;i<n;++i)
118         {
119             tempIt=erase(tempIt);
120             return tempIt;
121         }
122     }
123 public:
124     Myvector();//默认构造
125     Myvector(int n);//有n个T的默认构造对象 构造进这个容器
126     Myvector(int n,T const& elem);//用n个elem对象 构造进这个容器
127     Myvector(Myvector const& other);//深拷贝
128     //Myvector();
129 
130     ~Myvector();//析构函数 释放所有的对象 也会将变量删除(堆内存和栈内存)
131     void clear();//清除 (删除堆内存里数据)
132 public:
133     size_t size() const;
134     size_t capacit() const;//返回容器代下
135     bool empty() const;//判断容器是否为空
136 public:
137     bool operator==(Myvector const& srcVector) const;//运算符重载==
138     bool operator!=(Myvector const& srcVector) const; //重载运算符!=
139 public:
140     void assgin(int n, T const& elem);//赋值
141     void swap(Myvector & srcVerctor);//交换
142 public:
143     T at(int index);//返回动态数组下标为index的元素 是c++中唯一会主动抛异常的函数
144     T operator[](int index);//重载[]运算符
145     T front();//得到容器中的第一个元素,不管容器为不为空
146     T back();
147 public:
148     void push_back(T const& elem);//往动态数组的 尾部添加数字
149     void pop_back(); //往动态数组的尾部进行删除数据
150 public:
151     void resize(int num);//讲元素的数量len改成num个数量  如果size()变大了,多出来的将用默认构造来创建
152     void resize(int num,const& elem);//resize的重载
153     void reserve(int num);//如果容器的容量不足扩大容量
154 };
155 
156 template<typename T>
157 void Myvector<T>::Myvector()//无参构造
158 {
159     pBuff = nullptr;
160     len = 0;
161     maxSize = 0;
162 }
163 
164 template<typename T>
165 void Myvector<T>::~Myvector()//析构函数 清除对象
166 {
167     clear();//调用clear函数 重复代码通过封装函数来提高代码的效率
168 }
169 template<typename T>
170 void Myvector<T>::clear()
171 {
172     if (pBuff != nullptr)
173     {
174         delete[] pBuff;
175         pBuff = nullptr;
176         len = 0;
177         maxSize = 0;
178     }
179 }
180 template<typename T>
181 void Myvector<T>::Myvector(int n)//n个有T的默认构造的构造对象 构造进这个容器
182 {//n个对象构造这个容器
183     if (n < 0)
184     {
185         pBuff = nullptr;
186         len = 0;
187         maxSize = 0;
188     }
189     else
190     {
191         len = maxSize = n;
192         pBuff = new T[maxSize];
193     }
194 }
195 
196 template<typename T>
197 void Myvector<T>::Myvector(int n, T const& elem)//用n个elem对象来构造这个容器  &来增加传递效率
198 {
199     if (n < 0)
200     {
201         pBuff = nullptr;
202         len = 0;
203         maxSize = 0;
204     }
205     else
206     {
207         len = maxSize = n;
208         pBuff[i] = new T[maxSize];
209         for (size_t i = 0; i < len; ++i)//size_t无符号的int
210         {
211             pBuff[i] = elem;
212         }
213     }
214 }
215 template<typename T>
216 void Myvector<T>::Myvector(Myvector const& other)
217 {
218     len = other.len;
219     maxSize = other.maxSize;
220     pBuff = nullptr;
221     if (len > 0)
222     {
223         pBuff = new T[maxSize];
224         for (int i = 0; i < len; ++i)
225             pBuff[i] = other.pBuff[i];
226     }
227 }
228 template<typename T>
229 size_t Myvector<T>::size() const//返回容器的长度
230 {
231     return len;
232 }
233 template<typename T>
234 size_t Myvector<T>::capacity() const//返回容器大小
235 {
236     return maxSize;
237 }
238 template<typename T>
239 bool Myvector<T>::empty() const//判断容器是否为空
240 {
241     //return pBuff == nullptr;泵使用这一种 这一种判定存不存在
242     return len == 0;//是否为0 0是空的
243 }
244 template<typename T>
245 bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
246 {
247     if (len != srcVector.len)//长度不等
248         return false;
249     for (size_t i = 0; i < len; ++i)//遍历判定内容是否相等
250     {
251         if (pBuff[i] != srcVector.pBuff[i])
252             return false;
253     }
254     return true;
255 }
256 template<typename T>
257 bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
258 {
259     return !(*this == srcVector);
260 }
261 template<typename T>
262 void Myvector<T>::assign(int n, T const& elem)//和带参构造类似 对容器进行赋值
263 {
264     clear();//重点:清除自身可能原有的动态内存
265     if (n > 0)
266     {
267         len = maxSize = n;
268         pBuff = new T[maxSize];
269         for (size_t i = 0; i < len; ++i)
270             pBuff[i] = elem;
271     }
272 }
273 template<typename T>
274 void Myvector<T>::swap(Myvector & srcVector)
275 {
276     T *tempBuff = pBuff;
277     size_t tempLen = len;
278     size_t tempMaxSize = maxSize;//定义三个变量
279 
280     pBuff = srcVector.pBuff;
281     len = srcVector.len;
282     maxSize = srcVector.maxSize;//数据的交换
283 
284     srcVector.pBuff = tempBuff;
285     srcVector.len = tempLen;
286     srcVector.maxSize = tempMaxSize;
287 }
288 template<typename T>
289 T CMyVector<T>::at(int index)//唯一的会主动抛异常的函数
290 {
291     if (index < 0 || index >= len)
292         throw "out_of_range";//防止越界 抛异常
293     return pBuff[index];
294 }
295 
296 template<typename T>
297 T CMyVector<T>::operator[](int index)//这个应该出错就出错 无法出来 按照给的要求来
298 {
299     return pBuff[index];
300 }
301 template<typename T>
302 T Myvector<T>::back()
303 {
304     return pBuff[len - 1];
305 }
306 
307 template<typename T>
308 T Myvector<T>::front()
309 {
310     return pBuff[0];
311 }
312 
313 template<typename T>
314 T Myvector<T>::operator[](int index)
315 {
316     return pBuff[index];
317 }
318 template<typename T>
319 void Myvector<T>::push_back(T const& elem)
320 {
321     //1 2 3 4 6 9 13 19
322     if (len >= maxSize)
323     {
324         maxSize = maxSize + ((maxSize >> 1) > 1 ? (maxSize >> 1) : 1);
325         T *tempBuff = new T[maxSize];
326         for (size_t i = 0; i < len; ++i)
327             tempBuff[i] = pBuff[i];
328         if (pBuff != nullptr)
329             delete[] pBuff;
330         pBuff = tempBuff;
331     }
332     pBuff[len++] = elem;
333 }
334 template<typename T>
335 void Myvector<T>::pop_back()
336 {
337     --len;
338 }
339 template<typename T>
340 void Myvector<T>::resize(int num)
341 {
342     if(num<0)
343     {
344         //return;throw
345         assert(nullptr);//断言函数
346     }
347     if(num>len)//num超出扩张空间的时候 通过扩张len的长度 来进行对num的保存
348     {
349         while(num>=maxSize)
350             maxSize=maxSize+(maxSize>>1)>1?(maxSize>>1):1);
351         T *tempBuff=new T[maxSize];
352         for(size_t i=0;i<len;++i)
353             tempBuff[i]=pBuff[i];
354         if(pBuff!=nullptr)
355             delete[] pBuff;
356         pBuff=tempBuff;
357     }
358     len=num;
359 }
360 template<typename T>
361 void Myvector<T>::resize(int num,T const& elem)
362 {
363     if(num<0)
364     {
365         //return;throw
366         assert(nullptr);//断言函数
367     }
368     if(num>len)//num超出扩张空间的时候 通过扩张len的长度 来进行对num的保存
369     {
370         while(num>=maxSize)
371             maxSize=maxSize+(maxSize>>1)>1?(maxSize>>1):1);//
372         T *tempBuff=new T[maxSize];
373         for(size_t i=0;i<len;++i)
374             tempBuff[i]=pBuff[i];
375         if(pBuff!=nullptr)
376             delete[] pBuff;
377         pBuff=tempBuff;
378         for(size_t i=len;i<num;++i)
379             pBuff[i]=elem;
380     }
381     len=num;
382 }
383 template<typename T>
384 void Myvector<T>::reserve(int num)
385 {
386     if(num>maxSize)
387     {
388         maxSize=num;
389         T* tempBuff=new T[maxSize];
390         for(size_t i=0;i<len;++i)
391             tempBuff[i]=pBuff[i];
392         if(pBuff!=nullptr)
393             delete[] pBuff;
394         pBuff=tempBuff;
395     }

主函数实现头文件中一些函数的算法

 1 #include<vector>
 2 using std::vector;
 3 //写一个动态内存
 4 
 5 class CA{
 6     int a;
 7 public:
 8     CA(int i){ i = a; }
 9     CA();
10 };
11 template <class T>
12 class CStack
13 {
14     T pBuff[10];
15 public:
16     CStack();
17     ~CStack();
18     void push(T const& val);//入栈
19     void pop();//出栈
20     T GetTop();//得到栈顶的元素
21 };
22 template <class T>
23 void CStack<T>::pop()
24 {
25     top--;
26 }
27 
28 template <class T>
29 CStack<T>::CStack()
30 {
31     top = 0;
32 }
33 
34 template <class T>
35 void CStack<T>::push(T const& val)
36 {
37     pBuff[top++] = val;
38 }
39 int main()
40 {
41     CA a(1);//调用带参构造
42     CA pa[10];//调用默认构造  数组不可以用带参构造来构造
43     CA *pa1 = new CA;//调用默认构造
44 
45     vector<int> v;
46     vector<int>::iterator vit;//迭代器
47     for(vit=v.begin();vit!=v.end();++vit)
48     {
49         printf("%d\n",*vit);
50     }
51 
52 
53     return 0;
54 }

 

vector内部实现2

标签:assign   set   struct   要求   注意   位置   不可   入栈   clear   

原文地址:https://www.cnblogs.com/liugangjiayou/p/11417517.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!