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

vector内部的实现1

时间:2019-08-24 23:18:27      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:template   other   cto   using   判断   定义   out   top   内存   

写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(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     return 0;
46 }

写一个字节的类对自己的类进行加工封装函数 实现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     Myvector();//默认构造
 10     Myvector(int n);//有n个T的默认构造对象 构造进这个容器
 11     Myvector(int n,T const& elem);//用n个elem对象 构造进这个容器
 12     Myvector(Myvector const& other);//深拷贝
 13     //Myvector();
 14 
 15     ~Myvector();//析构函数 释放所有的对象 也会将变量删除(堆内存和栈内存)
 16     void clear();//清除 (删除堆内存里数据)
 17 public:
 18     size_t size() const;
 19     size_t capacit() const;//返回容器代下
 20     bool empty() const;//判断容器是否为空
 21 public:
 22     bool operator==(Myvector const& srcVector) const;//运算符重载==
 23     bool operator!=(Myvector const& srcVector) const; //重载运算符!=
 24 public:
 25     void assgin(int n, T const& elem);//赋值
 26     void swap(Myvector & srcVerctor);//交换
 27 public:
 28     T at(int index);//返回动态数组下标为index的元素 是c++中唯一会主动抛异常的函数
 29     T operator[](int index);//重载[]运算符
 30     T front();//得到容器中的第一个元素,不管容器为不为空
 31     T back();
 32 public:
 33     void push_back(T const& elem);//往动态数组的 尾部添加数字
 34 };
 35 template<typename T>
 36 void Myvector<T>::Myvector()//无参构造
 37 {
 38     pBuff = nullptr;
 39     len = 0;
 40     maxSize = 0;
 41 }
 42 
 43 template<typename T>
 44 void Myvector<T>::~Myvector()//析构函数 清除对象
 45 {
 46     clear();//调用clear函数 重复代码通过封装函数来提高代码的效率
 47 }
 48 template<typename T>
 49 void Myvector<T>::clear
 50 {
 51     if (pBuff != nullptr)
 52     {
 53         delete[] pBuff;
 54         pBuff = nullptr;
 55         len = 0;
 56         maxSize = 0;
 57     }
 58 }
 59 template<typename T>
 60 void Myvector<T>::Myvector(int n)//n个有T的默认构造的构造对象 构造进这个容器
 61 {//n个对象构造这个容器
 62     if (n < 0)
 63     {
 64         pBuff = nullptr;
 65         len = 0;
 66         maxSize = 0;
 67     }
 68     else
 69     {
 70         len = maxSize = n;
 71         pBuff = new T[maxSize];
 72     }
 73 }
 74 
 75 template<typename T>
 76 void Myvector<T>::Myvector(int n, T const& elem)//用n个elem对象来构造这个容器  &来增加传递效率
 77 {
 78     if (n < 0)
 79     {
 80         pBuff = nullptr;
 81         len = 0;
 82         maxSize = 0;
 83     }
 84     else
 85     {
 86         len = maxSize = n;
 87         pBuff[i] = new T[maxSize];
 88         for (size_t i = 0; i < len; ++i)//size_t无符号的int
 89         {
 90             pBuff[i] = elem;
 91         }
 92     }
 93 }
 94 template<typename T>
 95 void Myvector<T>::Myvector(Myvector const& other)
 96 {
 97     len = other.len;
 98     maxSize = other.maxSize;
 99     pBuff = nullptr;
100     if (len > 0)
101     {
102         pBuff = new T[maxSize];
103         for (int i = 0; i < len; ++i)
104             pBuff[i] = other.pBuff[i];
105     }
106 }
107 template<typename T>
108 size_t Myvector<T>::size() const//返回容器的长度
109 {
110     return len;
111 }
112 template<typename T>
113 size_t Myvector<T>::capacity() const//返回容器大小
114 {
115     return maxSize;
116 }
117 template<typename T>
118 bool Myvector<T>::empty() const//判断容器是否为空
119 {
120     //return pBuff == nullptr;泵使用这一种 这一种判定存不存在
121     return len == 0;//是否为0 0是空的
122 }
123 template<typename T>
124 bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
125 {
126     if (len != srcVector.len)//长度不等
127         return false;
128     for (size_t i = 0; i < len; ++i)//遍历判定内容是否相等
129     {
130         if (pBuff[i] != srcVector.pBuff[i])
131             return false;
132     }
133     return true;
134 }
135 template<typename T>
136 bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
137 {
138     return !(*this == srcVector);
139 }
140 template<typename T>
141 void Myvector<T>::assign(int n, T const& elem)//和带参构造类似 对容器进行赋值
142 {
143     clear();//重点:清除自身可能原有的动态内存
144     if (n > 0)
145     {
146         len = maxSize = n;
147         pBuff = new T[maxSize];
148         for (size_t i = 0; i < len; ++i)
149             pBuff[i] = elem;
150     }
151 }
152 
153 void Myvector<T>::swap(Myvector & srcVector)
154 {
155     T *tempBuff = pBuff;
156     size_t tempLen = len;
157     size_t tempMaxSize = maxSize;//定义三个变量
158 
159     pBuff = srcVector.pBuff;
160     len = srcVector.len;
161     maxSize = srcVector.maxSize;//数据的交换
162 
163     srcVector.pBuff = tempBuff;
164     srcVector.len = tempLen;
165     srcVector.maxSize = tempMaxSize;
166 }
167 template<typename T>
168 T CMyVector<T>::at(int index)//唯一的会主动抛异常的函数
169 {
170     if (index < 0 || index >= len)
171         throw "out_of_range";//防止越界 抛异常
172     return pBuff[index];
173 }
174 
175 template<typename T>
176 T CMyVector<T>::operator[](int index)//这个应该出错就出错 无法出来 按照给的要求来
177 {
178     return pBuff[index];
179 }
180 template<typename T>
181 T Myvector<T>::back()
182 {
183     return pBuff[len - 1];
184 }
185 
186 template<typename T>
187 T Myvector<T>::front()
188 {
189     return pBuff[0];
190 }
191 
192 template<typename T>
193 T Myvector<T>::operator[](int index)
194 {
195     return pBuff[index];
196 }
197 template<typename T>
198 void Myvector<T>::push_back(T const& elem)
199 {
200     //1 2 3 4 6 9 13 19
201     if (len >= maxSize)
202     {
203         maxSize = maxSize + ((maxSize >> 1) > 1 ? (maxSize >> 1) : 1);
204         T *tempBuff = new T[maxSize];
205         for (size_t i = 0; i < len; ++i)
206             tempBuff[i] = pBuff[i];
207         if (pBuff != nullptr)
208             delete[] pBuff;
209         pBuff = tempBuff;
210     }
211     pBuff[len++] = elem;
212 }

 

vector内部的实现1

标签:template   other   cto   using   判断   定义   out   top   内存   

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

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