数据结构--变长数组
刚发现,以前用vector觉得挺简单的,自己实现一下才知道这么麻烦。真是佩服那些C++大师,写出这么好的东西。
这算是一个简易的vector吧,之所以说它简易,并不是因为功能少,而是实现的复杂度远远不及std::vector
但基本原理是一样的
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
数据结构--变长数组相关推荐
- c99变长数组_你学过数组,那你知道柔性数组吗?
1 引言 定长数组包 在平时的开发中,缓冲区数据收发时,如果采用缓冲区定长包,假定大小是 1k,MAX_LENGTH 为 1024.结构体如下: // 定长缓冲区struct max_buffer{ ...
- 如何在java中创建变长数组
传统的数组创建 在java中我们都知道创建简单数组较为简单,和C很相似.如下是创建1.2.3维数组的代码. int [] array = new int[5]; int [][] array = ne ...
- 通过变长数组(VLA)来看编译器的不同
2019独角兽企业重金招聘Python工程师标准>>> 代码一: const int x=5; int num[x]; 代码二: int x=5; int num[x]; 代码一能够 ...
- MODE —— 计算10个分数的平均值(知识点: 数组 变长数组)
数组是一个数目固定,类型相同的数据项,数组中的数据项称为元素.数组中的元素都是int.long.或者其他类型. 声明一个数组时,要给编译器提供为数组分配内存所需要的所有信息,包括值的类型(决定每个元素 ...
- C/C++之变长数组(VLA)和可伸缩型数组成员
数组主要用来处理一系列同类型的数据集合,在C/C++中应用十分广泛.其中有两种特殊的数组,变长数组(VLA)和可伸缩型数组成员,应用得当的话,会非常方便. ##变长数组(VLA) 在多维数组中,数组的 ...
- C语言变长数组data[0]【总结】
C语言变长数组data[0][总结] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在li ...
- C语言变长数组 struct中char data[0]的用法
摘要:在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组.此时,我们可以使用结构体的方法实现C语言变长数组. struct MyData { int nLen; char d ...
- c++什么时候数组溢出_C语言,营养丰富的C语言五,变长数组不是动态数组
大家好,感谢朋友的支持阅读和关注,虽然我提出的这些小知识点看得人很少,但是每涨一个阅读和关注,都能让我开心很久,所以再次感谢一起学习的朋友们. 查余补漏: 在前几次的讲解中,有朋友提出C语言的内存分配 ...
- C99中的变长数组(VLA)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...
- c语言变长数组参数,使用gdb跟踪C语言中变长数组的实现
项目的代码中出现的一个问题,问题的表现是,在一个函数中使用到了变长数组,而对超过这个数组 范围的一个赋值,导致了数组首地址为空. 我把这个问题抽出来形成了一个示例函数,在i386下也出现类似的问题,代 ...
最新文章
- 转载 - 10个基于jQuery实现的漂亮网站赏析
- C语言两种查找方式(分块查找,二分法)
- 不用库函数求平方根!
- JavaScript数据结构与算法——数组详解(下)
- 移动端系列讲解之字体单位
- Yii防注入***笔记
- CentOS 6 下升级安装Mysql 5.5 完整步骤
- lisp 角平分线_《最佳Visual-LISP-及VBA-for-AutoCAD-2000程序123例》.pdf
- html圆圈复选框的代码,单选、复选框Demo
- RestTemplate 发送文件
- 概率论与数理统计基础概念整理
- android 随手记 摄像头录像
- 【数据结构和算法】爆肝三万字你必须知道的20个解决问题的技巧
- 黑平台Seener Tech Limtied在MT5上面搭建虚假交易 鼓动操作爆仓
- virtualenv下载超时
- [fpga基础]基础元器件
- pandas_datareader下载雅虎财经股价数据
- c语言限制字符串长度范围,字符串长度C语言版
- TRAVEO II的EVB评估板试用
- Zynq7000系列之芯片引脚功能合集以及引脚分配