功能尚不完全, 存在缺陷。定义Vector<int> vec(10, 10)会报出异常, 原因是无法识别10是int型还是iterator型。

注意几点:

分配内存不要使用new和delete,因为new的同时就把对象构造了,而我们需要的是原始内存。

所以应该使用标准库提供的allocator类来实现内存的控制。当然也可以重载operator new操作符,因为二者都是使用malloc作为底层实现,所以直接采用malloc也可以。

对象的复制必须使用系统提供的uninitialized_fill和uninitialized_copy,因为我们无法手工调用构造函数。

对于C++中的对象,除了POD之外,使用memcpy系列的函数是绝对错误的。

代码如下:

  1 #ifndef VECTOR_H
  2 #define VECTOR_H
  3
  4 #include <memory>
  5 #include <algorithm>
  6 #include <stddef.h>
  7 #include <limits>
  8 template <typename T, typename Alloc>
  9 class Vector;
 10
 11 template <typename T, typename Alloc>
 12 bool operator== (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 13 template <typename T, typename Alloc>
 14 bool operator!= (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 15 template <typename T, typename Alloc>
 16 bool operator> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 17 template <typename T, typename Alloc>
 18 bool operator>= (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 19 template <typename T, typename Alloc>
 20 bool operator< (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 21 template <typename T, typename Alloc>
 22 bool operator<= (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 23
 24
 25 template <typename T, typename Alloc = std::allocator<T> >
 26 class Vector
 27 {
 28     friend bool operator==<T, Alloc> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 29     friend bool operator!=<T, Alloc> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 30     friend bool operator> <T, Alloc> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 31     friend bool operator>=<T, Alloc> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 32     friend bool operator< <T, Alloc> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 33     friend bool operator<=<T, Alloc> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b);
 34
 35     class reverse_iterator;
 36     class const_reverse_iterator;
 37 public:
 38     typedef T value_type;
 39     typedef T *iterator;
 40     typedef const T *const_iterator;
 41     typedef reverse_iterator reverse_iterator;
 42     typedef const_reverse_iterator const_reverse_iterator;
 43     typedef T &reference;
 44     typedef const T &const_reference;
 45     typedef T *pointer;
 46     typedef const T *const_pointer;
 47     typedef size_t size_type;
 48     typedef ptrdiff_t difference_type;
 49     typedef Alloc allocator_type;
 50 private:
 51     //逆序迭代器
 52     class reverse_iterator
 53     {
 54     public:
 55         reverse_iterator(iterator it = NULL) :_current(it) { }
 56         iterator base() const {return _current; }
 57         reverse_iterator &operator++ ()
 58         {
 59             -- _current;
 60             return *this;
 61         }
 62         reverse_iterator operator++ (int)
 63         {
 64             reverse_iterator tmp(*this);
 65             -- _current;
 66             return tmp;
 67         }
 68         reverse_iterator &operator-- ()
 69         {
 70             ++ _current;
 71             return *this;
 72         }
 73         reverse_iterator operator-- (int)
 74         {
 75             reverse_iterator tmp(*this);
 76             ++ _current;
 77             return tmp;
 78         }
 79
 80         reference operator*()
 81         {
 82             return *(_current - 1);
 83         }
 84
 85         const_reference operator*() const
 86         {
 87             return *(_current - 1);
 88         }
 89
 90         pointer operator-> ()
 91         { return _current - 1; }
 92
 93         const_pointer operator-> () const
 94         { return _current - 1; }
 95
 96         friend bool operator== (reverse_iterator i,
 97                                 reverse_iterator j)
 98         {
 99             return i._current == j._current;
100         }
101
102         friend bool operator!= (reverse_iterator i,
103                                 reverse_iterator j)
104         {
105             return i._current != j._current;
106         }
107
108
109         friend difference_type operator-(reverse_iterator i,
110                                          reverse_iterator j)
111         {
112             return i._current - j._current;
113         }
114     private:
115             iterator _current;
116     };
117     //逆序迭代器
118
119
120     //const逆序迭代器
121     class const_reverse_iterator
122     {
123     public:
124         const_reverse_iterator(const_iterator it = NULL) :_current(it) { }
125         const_reverse_iterator(reverse_iterator it) :_current(it.base()) { }
126         const_iterator base() const {return _current; }
127         const_reverse_iterator &operator++ ()
128         {
129             -- _current;
130             return *this;
131         }
132         const_reverse_iterator operator++ (int)
133         {
134             reverse_iterator tmp(*this);
135             -- _current;
136             return tmp;
137         }
138         const_reverse_iterator &operator-- ()
139         {
140             ++ _current;
141             return *this;
142         }
143         const_reverse_iterator operator-- (int)
144         {
145             reverse_iterator tmp(*this);
146             ++ _current;
147             return tmp;
148         }
149
150         const_reference operator*() const
151         {
152             return *(_current - 1);
153         }
154
155
156         const_pointer operator-> () const
157         { return _current - 1; }
158
159         friend bool operator== (const_reverse_iterator i,
160                                 const_reverse_iterator j)
161         {
162             return i._current == j._current;
163         }
164
165         friend bool operator!= (const_reverse_iterator i,
166                                 const_reverse_iterator j)
167         {
168             return i._current != j._current;
169         }
170
171
172         friend difference_type operator-(const_reverse_iterator i,
173                                          const_reverse_iterator j)
174         {
175             return i._current - j._current;
176         }
177     private:
178             const_iterator _current;
179     };
180     //const逆序迭代器
181
182
183
184 public:
185     //三种构造Vector的方法
186     Vector() { create(); }
187
188     explicit Vector(size_type n, const value_type &val = value_type())
189     { create(n, val); }
190
191     template <typename In>
192     Vector(In i, In j)
193     { create(i, j); }
194
195     //复制v对象
196     Vector(const Vector &v)
197     { create(v.begin(), v.end()); }
198     //赋值函数
199     Vector &operator= (const Vector &v);
200     //析构函数
201     ~Vector() { uncreate(); }
202     //assign操作的几种形式
203     template <typename In>
204     void assign(In i, In j)
205     {
206         uncreate();
207         create(i, j);
208     }
209
210     void assign(size_type n, const T &val)
211     {
212         uncreate();
213         create(n, val);
214     }
215     //下标操作
216     reference operator[] (size_type index) { return _data[index]; }
217     const_reference operator[] (size_type index) const { return _data[index]; }
218     //at操作
219     reference at(size_type index) { return _data[index]; }
220     const_reference at(size_type index) const { return _data[index]; }
221     //front、back操作
222     reference front() { return *begin(); }
223     reference back() { return *rbegin(); }
224     const_reference front() const { return *begin(); }
225     const_reference back() const { return *rbegin(); }
226
227     //pop_back操作
228     void pop_back()
229     { _alloc.destroy(-- _avail); }
230     //insert函数的几种操作
231     iterator insert (iterator pos, const value_type &val);
232
233     void insert(iterator pos, size_type n, const value_type &val);
234
235     template <typename InputIterator>
236     void insert(iterator pos, InputIterator first, InputIterator last);
237
238     //erase的几种操作
239     iterator erase(iterator pos);
240
241     iterator erase(iterator first, iterator last);
242
243
244     //resize和reserve的操作
245     void resize(size_type n, value_type val = value_type());
246     void reserve(size_type n);
247
248     //判断是否为空、查看元素个数、查看空间大小
249     bool empty() const { return _data == _avail; }
250     size_type size() const { return _avail - _data; }
251
252     size_type capacity() const { return _limit - _data; }
253
254     size_type max_size() const
255     { return std::numeric_limits<size_type>::max() / sizeof(T); }
256     //begin、end迭代器操作
257     iterator begin() { return _data; }
258     const_iterator begin() const { return _data; }
259
260     iterator end() { return _avail; }
261     const_iterator end() const { return _avail; }
262
263     //rbegin、rend迭代器操作
264     reverse_iterator rbegin() { return reverse_iterator(_avail); }
265     reverse_iterator rend() { return reverse_iterator(_data); }
266
267     const_reverse_iterator rbegin() const { return const_reverse_iterator(_avail); }
268     const_reverse_iterator rend() const { return const_reverse_iterator(_data); }
269     //push_back操作
270     void push_back(const T &t)
271     {
272         if(_avail == _limit)
273             grow();
274         unCheckdAppend(t);
275     }
276
277     //与other对象进行交换
278     void swap(Vector &other)
279     {
280         std::swap(_data, other._data);
281         std::swap(_avail, other._avail);
282         std::swap(_limit, other._limit);
283     }
284     //
285     allocator_type get_allocator() const
286     { return _alloc; }
287
288
289 private:
290     iterator _data;             //数组首元素
291     iterator _avail;            //数组最后一个元素的下一个位置
292     iterator _limit;            //最后一块内存的下一块位置
293
294     std::allocator<T> _alloc;   //内存分配器
295
296
297     void create();
298     void create(size_type, const value_type &);
299
300     template <typename In>
301     void create(In i, In j);
302
303
304     void uncreate();
305
306     void grow();            //内存增长
307     void unCheckdAppend(const T &val);
308
309     void growTon(size_type n);
310 };
311 //复制构造函数
312 template <typename T, typename Alloc>
313 Vector<T, Alloc> &Vector<T, Alloc>::operator= (const Vector &v)
314 {
315     if(this != &v)
316     {
317         uncreate();
318         create(v.begin(), v.end());
319     }
320
321     return *this;
322 }
323
324
325 //三个构造函数
326 template <typename T, typename Alloc>
327 void Vector<T,Alloc>::create()
328 {
329     _data = _avail = _limit = NULL;
330 }
331
332
333 template <typename T, typename Alloc>
334 void Vector<T, Alloc>::create(size_type n, const T &val)
335 {
336     //先分配内存
337     _data = _alloc.allocate(n);
338     //初始化赋值
339     std::uninitialized_fill(_data, _data + n, val);
340     _avail = _limit = _data + n;
341 }
342
343
344 template <typename T, typename Alloc>
345 template <typename In>
346 void Vector<T, Alloc>::create(In i, In j)
347 {
348     _data = _alloc.allocate(j - i);
349
350     _avail = _limit = std::uninitialized_copy(i, j, _data);
351
352 }
353
354
355 //析构函数
356 template <typename T, typename Alloc>
357 void Vector<T, Alloc>::uncreate()
358 {
359     //先执行析构函数
360     if(_data)
361     {
362         iterator it(_avail);
363         while(it != _data)
364         {
365             _alloc.destroy(-- it);
366         }
367     }
368
369     //释放内存
370     _alloc.deallocate(_data, _limit - _data);
371     _data = _avail = _limit = NULL;
372 }
373
374
375
376 //grow函数
377 template <typename T, typename Alloc>
378 void Vector<T, Alloc>::grow()
379 {
380     //确定size
381     size_type new_size = std::max(2 * (_limit - _data), difference_type(1));
382
383     growTon(new_size);
384 }
385
386
387 //unCheckdAppend函数
388 template <typename T, typename Alloc>
389 void Vector<T, Alloc>::unCheckdAppend(const T &val)
390 {
391     _alloc.construct(_avail ++, val);
392 }
393
394
395 //growTon函数
396 template <typename T, typename Alloc>
397 void Vector<T, Alloc>::growTon(size_type n)
398 {
399     iterator new_data = _alloc.allocate(n);
400     iterator new_avail = std::uninitialized_copy(_data, _avail, new_data);
401
402     uncreate();
403
404     _data = new_data;
405     _avail = new_avail;
406     _limit = _data + n;
407 }
408
409
410 //insert函数
411
412 template <typename T, typename Alloc>
413 typename Vector<T, Alloc>::iterator Vector<T, Alloc>::insert(iterator pos, const value_type &val)
414 {
415     difference_type i = pos - _data;
416     insert(pos, 1, val);
417     return pos + i;
418 }
419
420
421 template <typename T, typename Alloc>
422 void Vector<T, Alloc>::insert(iterator pos, size_type n, const value_type &val)
423 {
424     difference_type i = pos - _data;
425     while(static_cast<size_type>(_limit - _avail) < n)
426         grow();
427     pos = _data + i;
428
429     size_type left = _avail - pos;
430
431     if(n < left)
432     {
433         size_type len = _avail - pos;
434         size_type copyLen = len - n;
435         std::uninitialized_copy(pos + copyLen, _avail, _avail);
436         std::copy_backward(pos, pos + copyLen, _avail);
437
438         std::fill_n(pos, n, val);
439     }
440     else if(n > left)
441     {
442         std::uninitialized_copy(pos, _avail, pos + n);
443
444         std::fill_n(pos, _avail - pos, val);
445         std::uninitialized_fill(_avail, pos + n, val);
446     }
447     else
448     {
449         std::uninitialized_copy(pos, _avail, _avail);
450         std::fill_n(pos, n, val);
451     }
452
453     _avail = _avail + n;
454 }
455
456 template <typename T, typename Alloc>
457 template <typename InputIterator>
458 void Vector<T, Alloc>::insert(iterator pos, InputIterator first, InputIterator last)
459 {
460     difference_type i = pos - _data;
461     size_type n = last - first;
462     while(static_cast<size_type>(_limit - _avail) < n)
463         grow();
464     pos = _data + i;
465
466     size_type left = _avail - pos;
467     if(n < left)
468     {
469         size_type len = _avail - pos;
470         size_type copyLen = len - n;
471         std::uninitialized_copy(pos + copyLen, _avail, _avail);
472         std::copy_backward(pos, pos + copyLen, _avail);
473
474         std::copy(first, last, pos);
475     }
476     else if(n > left)
477     {
478         std::uninitialized_copy(pos, _avail, pos + n);
479
480         std::copy(first, first + left, pos);
481         std::uninitialized_copy(first + left, last, _avail);
482     }
483     else
484     {
485         std::uninitialized_copy(pos, _avail, _avail);
486
487         std::copy(first, last, pos);
488     }
489
490     _avail = _avail + n;
491 }
492
493
494 //erase函数
495
496 template <typename T, typename Alloc>
497 typename Vector<T, Alloc>::iterator Vector<T, Alloc>::erase(iterator pos)
498 {
499     std::copy(pos + 1, _avail, pos);
500     _alloc.destroy(-- _avail);
501     return pos;
502 }
503
504 template <typename T, typename Alloc>
505 typename Vector<T, Alloc>::iterator Vector<T, Alloc>::erase(iterator first, iterator last)
506 {
507     difference_type left = _avail - last;
508     std::copy(last, _avail, first);
509
510     iterator it(first + left);
511     while(_avail != it)
512         _alloc.destroy(-- _avail);
513     return first;
514 }
515
516
517 //resize函数
518 template <typename T, typename Alloc>
519 void Vector<T, Alloc>::resize(size_type n, value_type val)
520 {
521     size_type cur_size = size();
522     if(n < cur_size)
523     {
524         size_type diff = cur_size - n;
525         while(diff --)
526             _alloc.destroy(-- _avail);
527     }
528     else if(n > cur_size)
529     {
530         size_type diff = n - cur_size;
531         size_type left = static_cast<size_type>(_limit - _avail);
532         if(left < diff)
533             growTon(n);
534
535         while(size() < n)
536             unCheckdAppend(val);
537     }
538 }
539
540 template <typename T, typename Alloc>
541 void Vector<T, Alloc>::reserve(size_type n)
542 {
543     size_type cur_cap = capacity();
544     if(n > cur_cap)
545         growTon(n);
546 }
547
548
549 //运算符重载
550 template <typename T, typename Alloc>
551 bool operator== (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b)
552 {
553     return a.size() == b.size() &&
554            std::equal(a.begin(), a.end(), b.begin() );
555 }
556
557
558 template <typename T, typename Alloc>
559 bool operator!= (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b)
560 {
561     return !(a == b);
562 }
563
564
565 template <typename T, typename Alloc>
566 bool operator< (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b)
567 {
568     typedef typename Vector<T, Alloc>::size_type size_type;
569     size_type size1 = a.size();
570     size_type size2 = b.size();
571     size_type min =(size1 < size2) ? size1 : size2;
572     size_type i = 0;
573     for(; i != min; ++ i)
574     {
575         if(a[i] < b[i])
576             return true;
577         else if(a[i] > b[i])
578             return false;
579     }
580     if(i != size2)
581         return true;
582     return false;
583 }
584
585
586 template <typename T, typename Alloc>
587 bool operator<= (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b)
588 {
589     return !(a > b);
590 }
591
592
593 template <typename T, typename Alloc>
594 bool operator> (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b)
595 {
596     return b < a;
597 }
598
599
600 template <typename T, typename Alloc>
601 bool operator>= (const Vector<T, Alloc> &a, const Vector<T, Alloc> &b)
602 {
603     return !(a < b);
604 }
605
606
607 #endif  /*VECTOR_H*/

测试代码如下:

 1 #include "Vector.hpp"
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5
 6 //测试const reverse迭代器
 7 void print(const Vector<string> &vec)
 8 {
 9     for(Vector<string>::const_reverse_iterator it = vec.rbegin();
10         it != vec.rend();
11         ++it)
12     {
13         cout << *it << " ";
14     }
15     cout << endl;
16 }
17
18 int main(int argc, char const *argv[])
19 {
20     Vector<string> vec(3, "hello");
21
22     for(Vector<string>::const_iterator it = vec.begin();
23         it != vec.end();
24         ++it)
25     {
26         cout << *it << " ";
27     }
28     cout << endl;
29
30     cout << "size = " << vec.size() << endl;
31     cout << "capacity = " << vec.capacity() << endl;
32     vec.push_back("foo");
33     vec.push_back("bar");
34
35     cout << "size = " << vec.size() << endl;
36     cout << "capacity = " << vec.capacity() << endl;
37
38     for(Vector<string>::reverse_iterator it = vec.rbegin();
39         it != vec.rend();
40         ++it)
41     {
42         cout << *it << " ";
43     }
44     cout << endl;
45
46
47     print(vec);
48
49     Vector<string> vec2;
50     vec2.push_back("beijing");
51     vec2.push_back("shanghai");
52     vec2.push_back("guangzhou");
53     print(vec2);
54
55     vec.swap(vec2);
56     print(vec);
57     print(vec2);
58
59     return 0;
60 }

转载于:https://www.cnblogs.com/gjn135120/p/4007198.html

vector的简单实现相关推荐

  1. vector的简单介绍

    1.vector的简单介绍 vector作为STL提供的标准容器之一,是经常要使用的,有很重要的地位,并且使用起来也是灰常方便.vector又被称为向量,vector可以形象的描述为长度可以动态改变的 ...

  2. set 和 vector的简单比较

    set的常见问题(转) (1)为何map和set的插入删除效率比用其他序列容器高? 大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动.说对了,确实如此.set容器内所有元素都是以节 ...

  3. C++ vector容器简单解释

    vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件  : #include < ...

  4. Vector的简单使用

    Mark一下 wstring tempword;vector <wstring> TempVec;tempword = _T("123");TempVec.push_b ...

  5. 类模板与运算符重载(一个简单的例子)

    类模板与运算符重载(一个简单的例子) 标签(空格分隔): C++ 算法竞赛 下面是一段简单的代码,表示我们建立了一个类模板Vector,可以看做是对STL中vector的简单实现. 为了让这个Vect ...

  6. java vector list,Java基础之:List——ArrayList Vector

    Java基础之:List--ArrayList & Vector ArrayList简单介绍 ArrayList实现了List接口,底层是一个数组,并实现了可变的功能.底层属性(transie ...

  7. spfa(STL写法)简单讲解+最短路(spfa)例题 acm寒假集训日记22/1/7

    前言:SPFA(Shortest Path Faster Algorithm)算法是求单源最短路线的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法. spfa 其实可以 ...

  8. vector容器详细介绍

    本文参考菜鸟教程,作为学习笔记,方便日后查阅. 介绍 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象. ...

  9. c++中vector用法(涵盖算法题中知识点)

    文章目录 1. vector 1.1 vector的说明 1.2 特别注意 1.3 vector实例 2. vector 创建与初始化 3.vector 常用内置函数 4. vector 中元素的访问 ...

最新文章

  1. Java 8 vs. Scala之Lambda表达式
  2. 中国生物质锅炉行业全景调研与投资前景研究分析报告2021-2027年
  3. Juliane Begenau
  4. 将长方形木框拉成平行四边形_【减负提质进行时】平行四边形的面积再思考
  5. jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy
  6. webstorm环境安装配置(less+autoprefixer)
  7. java 往excel中写数据库,poi将数据写入excel表格-怎么用java把数据库里的数据写入到excel表中...
  8. C++ 拷贝构造函数
  9. 电磁场与电磁波实验:仿真计算介质板的电磁参数
  10. CentOS修改时区
  11. Linux 环境下 vi/vim 编辑器常用命令
  12. AspectJWeaver
  13. CS61B-JAR File
  14. HTML 拓扑 http://www.hightopo.com/demos/index.html 拓扑
  15. 前端常见浏览器兼容性问题解决方案
  16. IT公司面试 逻辑题目
  17. 安装Win7时删除系统保留的100M隐藏分区
  18. 一分钟带你了解全链路测试
  19. 寒武纪笔试题——12小时制转24小时制(C\C++实现)
  20. 形容计算机科学与技术的句子,描写科学的句子精选40句

热门文章

  1. C#编写窗体(Form)常用属性
  2. K8s Pod 钩子生命周期
  3. 两线怎么接三线插座图_水温传感器怎么判断好坏
  4. 分布式事务六种解决方案
  5. 基于注册中心的Dubbo服务
  6. Spring-Cloud中的统一配置中心
  7. Redis LRU 淘汰原理
  8. 自己写一个实现ApplicationListener​接口并且把该组件加入到容器中
  9. EJB和JavaBean的区别
  10. 模拟spring IOC、源码分析