vector内部实现2

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 }

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

时间: 2024-10-06 10:42:24

vector内部实现2的相关文章

vector内部的实现1

写vector的内部方法 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

STL ——vector 学习

STL简介 C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序员以下三类数据结构的实现: 标准容器类   顺序性容器  vector 从后面快速的插入与删除,直接访问任何元素  deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速插入与删除   关联容器  

ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长:ArrayList每次增长为原来的50%;Vector每次增长为原来的100%; (从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当向集合中添加对象时,如果内部数组长度不够用时,长度会自动增长.ArrayList会增长为原来的1.5倍,Vecto

C++ vector解析 (C++ 11)

本文在我另外一个博客也同步:http://www.cnblogs.com/pengjunwei/p/4414677.html Vector表示可以改变大小的数组容器. 就像数组,其元素的向量使用连续的存储位置,这意味着还可以访问其元素上使用偏移量经常指向元素的指针,和在数组中一样有效.但与数组不同,其大小可动态变化,他们的存储容器自动处理. 在vector内部,使用动态分配的数组向量来存储他们的内容.此数组可能需要重新分配,以便规模的扩大新元素被插入时,这意味着为它分配一个新的数组,并将所有元素

vector动态二维数组(容器的容器)占用内存分析

之前在这里写过一篇"C++中的动态二维数组".在C++中没有动态二维(多维)数组.但是根据原理我们可以自己创建. 在看过STL的vector源代码后"<STL源码剖析>---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组. 创建一个2x4的二维数组.想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列). int row=2,col=4; vector<vector<int> &g

C++标准模板库之vector(Boolan)

vector是C++标准模板库中一种常见的容器,像数组类似,vector使用连续的存储空间用来保存元素,使用指针偏移可以快速的访问元素(通常认为是O1复杂度),与数组不同的是它的大小是可变的,在vector内部使用动态分配的内存保存元素,这意味着vector增长时需要重新分配内存,并将原来的原来的数据复制到该内存单元,需要很大的开销,因此vector并不会在每次新增元素时候都重新分配内存空间.vector实际容量(capacity)通常比实际大小(size)大得多.参考数据结构(C++语言版),

java1.7集合源码阅读: Vector

Vector是List接口的另一实现,有非常长的历史了,从jdk1.0开始就有Vector了,先于ArrayList出现,与ArrayList的最大区别是:Vector 是线程安全的,简单浏览一下Vector: 类定义: 1 public class Vector<E> 2 extends AbstractList<E> 3 implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector支

怎样线程安全地遍历List:Vector、CopyOnWriteArrayList

遍历List的多种方式 在讲怎样线程安全地遍历List之前,先看看通常我们遍历一个List会採用哪些方式. 方式一: for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } 方式二: Iterator iterator = list.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } 方式三: for

ArrayList/LinkedList/Vector源码分析

ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable ArrayList继承了AbstractList,实现了List,表示ArrayList实现了线性表的所有功能,本质上是一个Object数组: ArrayList实现了RandomAccess接口,表示提供随机访问功能,A