刚发现,以前用vector觉得挺简单的,自己实现一下才知道这么麻烦。真是佩服那些C++大师,写出这么好的东西。

这算是一个简易的vector吧,之所以说它简易,并不是因为功能少,而是实现的复杂度远远不及std::vector

但基本原理是一样的

  1 #pragma once
  2 
  3 const int INIT_ARRAY_SIZE = 10;
  4 template<typename T>
  5 class Array
  6 {
  7 public:
  8     struct Iterator    {
  9         
 10         Iterator(T* ptr):m_ptr(ptr){}
 11 
 12         T& operator*()
 13         {
 14             return (*m_ptr);
 15         }
 16 
 17         T* operator->()
 18         {
 19             return (&**this);
 20         }
 21 
 22         Iterator& operator++()
 23         {
 24             ++m_ptr;
 25             return *this;
 26         }
 27         Iterator operator++(int)
 28         {
 29             Iterator temp = *this;
 30             ++(*this);
 31             return temp;
 32         }
 33 
 34         Iterator& operator--()
 35         {
 36             --m_ptr;
 37             return *this;
 38         }
 39         Iterator operator--(int)
 40         {
 41             Iterator temp = *this;
 42             --(*this);
 43             return temp;
 44         }
 45 
 46         bool operator!=(const Iterator &it)
 47         {
 48             return m_ptr != it.m_ptr;
 49         }
 50 
 51         bool operator==(const Iterator &it)
 52         {
 53             return m_ptr == it.m_ptr;
 54         }
 55 
 56         bool operator<(const Iterator &it)
 57         {
 58             return m_ptr<it.m_ptr;
 59         }
 60 
 61         Iterator operator+(size_t off) const
 62         {
 63             Iterator tmp = *this;
 64             tmp.m_ptr+=off;
 65             return tmp;
 66         }
 67 
 68 
 69 
 70         Iterator operator-(size_t off)
 71         {
 72             Iterator tmp = *this;
 73             tmp.m_ptr-=off;
 74             return tmp;
 75         }
 76 
 77         size_t operator-(const Iterator& it)
 78         {
 79             return m_ptr - it.m_ptr;
 80         }
 81 
 82 
 83         T* m_ptr;
 84     };
 85     Array()
 86         : m_head(new T[INIT_ARRAY_SIZE]),
 87           m_last(m_head),
 88           m_end(m_head+INIT_ARRAY_SIZE-1)
 89     {}
 90 
 91     Array(size_t t)
 92         : m_head(new T[INIT_ARRAY_SIZE<t ? t : INIT_ARRAY_SIZE]),
 93           m_last(m_head+t),
 94           m_end(m_head+(INIT_ARRAY_SIZE<t ? t-1 : INIT_ARRAY_SIZE-1))
 95     {}
 96 
 97     T& operator[](size_t t)
 98     {
 99         return *(m_head+t);
100     }
101 
102     size_t size()
103     {
104         return m_head == 0 ? 0 : m_last-m_head/* / sizeof(T)*/;
105     }
106 
107     
108 
109     void push_back(const T& data)
110     {
111         size_t s;
112         s = size();
113         s = capacity();
114         if(size() <capacity())
115         {
116             m_head[size()] = data;
117             m_last++;
118         }
119         else//需要扩充长度
120         {
121             insert(end(), data);
122         }
123     }
124 
125     Iterator insert(Iterator _Where, const T& data)
126     {
127         size_t off = _Where - begin();
128         _Insert(_Where, 1, data);
129         return begin()+off;
130     }
131 
132     Iterator begin()
133     {
134         return m_head;
135     }
136 
137     Iterator end()
138     {
139         return m_last;
140     }
141 
142     bool empty()
143     {
144         return size() == 0;
145     }
146 
147     void remove(Iterator _Where)
148     {
149         if(empty())
150         {
151             return;
152         }
153         
154         size_t off = _Where-begin();
155 
156         
157 
158         _move(_Where+1, end(), m_head+off);
159         m_last--;
160     }
161 
162 private:
163 
164 
165     size_t capacity()
166     {
167         return m_head == 0 ? 0 : m_end-m_head;
168     }
169 
170     void _Insert(Iterator _Where, size_t nCount, const T& data)
171     {
172 
173         if(capacity() - size() < nCount)
174         {
175 
176             size_t oldSize = size();
177             size_t Capacity = capacity();
178             size_t newSize = (Capacity+1)*1.5;
179             if (newSize < size() + nCount)
180             {
181                 newSize = size() + nCount;
182             }
183 
184             T* temp = new T[newSize];
185 
186             T* t = temp;
187             Iterator it = begin();
188             t = _move(begin(), _Where, t);
189 
190             t = _fill(t, t+nCount, data);
191 
192             _move(_Where, end(), t);
193 
194             delete[] m_head;
195     
196             m_head = temp;
197             m_last = m_head + oldSize + nCount;
198             m_end = temp + newSize - 1;
199 
200         }
201         else if(end() - _Where < nCount)
202         {
203             T* p = _move(_Where, m_last, _Where.m_ptr+nCount);
204         
205 
206             _fill(_Where, _Where+nCount, data);
207             m_last+=nCount;
208         }
209         else
210         {
211             T* oldEnd = m_last;
212         
213 
214             _copy_backward(_Where, oldEnd, oldEnd+nCount);
215 
216 
217             
218             _fill(_Where, _Where+nCount, data);
219             m_last += nCount;
220 
221         }
222     }
223 
224     T* _move(Iterator _First, Iterator _Last, T* p)
225     {
226         for(; _First != _Last; )
227         {
228             *p++= *_First++;
229             
230         }
231 
232         return p;
233     }
234 
235     void _copy_backward(Iterator _First, Iterator _Last, T* p)
236     {
237         for(; !(_Last < _First); )
238         {
239             *p-- = *_Last--;
240         }
241     }
242 
243     T* _fill(Iterator _First, Iterator _Last, const T& data)
244     {
245         for(; _First != _Last; )
246         {
247             *_First++ = data;
248         }
249 
250         return _First.m_ptr;
251     }
252 
253     T* m_head;
254     T* m_last;
255     T* m_end;
256 };

转载于:https://www.cnblogs.com/yjsoft/archive/2008/10/07/1305945.html

数据结构--变长数组相关推荐

  1. c99变长数组_你学过数组,那你知道柔性数组吗?

    1 引言 定长数组包 在平时的开发中,缓冲区数据收发时,如果采用缓冲区定长包,假定大小是 1k,MAX_LENGTH 为 1024.结构体如下: // 定长缓冲区struct max_buffer{ ...

  2. 如何在java中创建变长数组

    传统的数组创建 在java中我们都知道创建简单数组较为简单,和C很相似.如下是创建1.2.3维数组的代码. int [] array = new int[5]; int [][] array = ne ...

  3. 通过变长数组(VLA)来看编译器的不同

    2019独角兽企业重金招聘Python工程师标准>>> 代码一: const int x=5; int num[x]; 代码二: int x=5; int num[x]; 代码一能够 ...

  4. MODE —— 计算10个分数的平均值(知识点: 数组 变长数组)

    数组是一个数目固定,类型相同的数据项,数组中的数据项称为元素.数组中的元素都是int.long.或者其他类型. 声明一个数组时,要给编译器提供为数组分配内存所需要的所有信息,包括值的类型(决定每个元素 ...

  5. C/C++之变长数组(VLA)和可伸缩型数组成员

    数组主要用来处理一系列同类型的数据集合,在C/C++中应用十分广泛.其中有两种特殊的数组,变长数组(VLA)和可伸缩型数组成员,应用得当的话,会非常方便. ##变长数组(VLA) 在多维数组中,数组的 ...

  6. C语言变长数组data[0]【总结】

    C语言变长数组data[0][总结] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在li ...

  7. C语言变长数组 struct中char data[0]的用法

    摘要:在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组.此时,我们可以使用结构体的方法实现C语言变长数组. struct MyData  {  int nLen;  char d ...

  8. c++什么时候数组溢出_C语言,营养丰富的C语言五,变长数组不是动态数组

    大家好,感谢朋友的支持阅读和关注,虽然我提出的这些小知识点看得人很少,但是每涨一个阅读和关注,都能让我开心很久,所以再次感谢一起学习的朋友们. 查余补漏: 在前几次的讲解中,有朋友提出C语言的内存分配 ...

  9. C99中的变长数组(VLA)

    处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...

  10. c语言变长数组参数,使用gdb跟踪C语言中变长数组的实现

    项目的代码中出现的一个问题,问题的表现是,在一个函数中使用到了变长数组,而对超过这个数组 范围的一个赋值,导致了数组首地址为空. 我把这个问题抽出来形成了一个示例函数,在i386下也出现类似的问题,代 ...

最新文章

  1. 转载 - 10个基于jQuery实现的漂亮网站赏析
  2. C语言两种查找方式(分块查找,二分法)
  3. 不用库函数求平方根!
  4. JavaScript数据结构与算法——数组详解(下)
  5. 移动端系列讲解之字体单位
  6. Yii防注入***笔记
  7. CentOS 6 下升级安装Mysql 5.5 完整步骤
  8. lisp 角平分线_《最佳Visual-LISP-及VBA-for-AutoCAD-2000程序123例》.pdf
  9. html圆圈复选框的代码,单选、复选框Demo
  10. RestTemplate 发送文件
  11. 概率论与数理统计基础概念整理
  12. android 随手记 摄像头录像
  13. 【数据结构和算法】爆肝三万字你必须知道的20个解决问题的技巧
  14. 黑平台Seener Tech Limtied在MT5上面搭建虚假交易 鼓动操作爆仓
  15. virtualenv下载超时
  16. [fpga基础]基础元器件
  17. pandas_datareader下载雅虎财经股价数据
  18. c语言限制字符串长度范围,字符串长度C语言版
  19. TRAVEO II的EVB评估板试用
  20. Zynq7000系列之芯片引脚功能合集以及引脚分配

热门文章

  1. 工作效率上的错觉(转载)
  2. 获取当前user的Session状态
  3. 学java后学python,宁波学习java还是python(孩子学Python怎么样)
  4. C# Json文件读取
  5. Hibernate 与触发器协同工作
  6. Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化(20)
  7. vs2010创建动态库(亲测可行)
  8. Markdown语言调整图片居中、大小
  9. springboot starter的一个问题
  10. android实现qq登录功能实现原理,Android实现QQ登录功能