std::allocator即空间配置器,用于内存分配。更多的细节建议大家研究相关源码。

这里仅是利用std::allocator来实现简单的自定义vector类,如有问题欢迎指正。

 1 #include <iostream>
 2 #include <memory>
 3 using std::cout;
 4 using std::endl;
 5
 6 template <typename Tp>
 7 class Vector
 8 {
 9 public:
10     Vector()
11     : _elems(NULL)
12     , _first_free(NULL)
13     , _end(NULL)
14     {}
15
16     ~Vector()
17     {
18         if(_elems)
19         {
20             while(_elems != _first_free)
21                 _alloc.destroy(--_first_free);
22             _alloc.deallocate(_elems,capacity());
23         }
24     }
25
26     void push_back(const Tp & value)
27     {
28         if(size() == capacity())
29         {
30             reallocate();
31         }
32         _alloc.construct(_first_free++,value);
33     }
34
35     void pop_back()
36     {
37         if(size() > 0)
38         {
39             _alloc.destory(--_first_free);
40         }
41     }
42
43     size_t size() const
44     {
45         return _first_free - _elems;
46     }
47     size_t capacity() const
48     {
49         return _end - _elems;
50     }
51
52     Tp & operator[](size_t idx)
53     {
54         return _elems[idx];
55     }
56
57 private:
58     void reallocate()
59     {
60         size_t oldCapacity = capacity();
61         size_t newCapacity = oldCapacity == 0 ? 1 : oldCapacity * 2;
62
63         Tp * newElems = _alloc.allocate(newCapacity);
64         if(_elems)
65         {
66             std::uninitialized_copy(_elems,_first_free,newElems);
67             while(_elems != _first_free)
68                 _alloc.destroy(--_first_free);
69             _alloc.deallocate(_elems,oldCapacity);
70         }
71         _elems = newElems;
72         _first_free = _elems + oldCapacity;
73         _end = _elems + newCapacity;
74     }
75 private:
76     static std::allocator<Tp> _alloc;
77     Tp * _elems;
78     Tp * _first_free;
79     Tp * _end;
80 };
81
82 template <typename Tp>
83 std::allocator<Tp> Vector<Tp>::_alloc;
84
85 void display(Vector<int> & vec)
86 {
87     cout << "vec's size = " << vec.size() << endl;
88     cout << "vec's capacity = " << vec.capacity() << endl;
89 }

以下是测试代码:

 1 int test()
 2 {
 3     Vector<int> vecInt;
 4     display(vecInt);
 5
 6     vecInt.push_back(1);
 7     display(vecInt);
 8     vecInt.push_back(2);
 9     display(vecInt);
10     vecInt.push_back(3);
11     display(vecInt);
12     vecInt.push_back(4);
13     display(vecInt);
14     vecInt.push_back(5);
15     display(vecInt);
16     vecInt.push_back(6);
17     display(vecInt);
18     vecInt.push_back(7);
19     display(vecInt);
20
21     for(size_t idx = 0; idx != vecInt.size(); ++idx)
22     {
23         cout << vecInt[idx] << " ";
24     }
25     cout << endl;
26     return 0;
27 }

测试结果:

 1 vec's size = 0
 2 vec's capacity = 0
 3 vec's size = 1
 4 vec's capacity = 1
 5 vec's size = 2
 6 vec's capacity = 2
 7 vec's size = 3
 8 vec's capacity = 4
 9 vec's size = 4
10 vec's capacity = 4
11 vec's size = 5
12 vec's capacity = 8
13 vec's size = 6
14 vec's capacity = 8
15 vec's size = 7
16 vec's capacity = 8
17 1 2 3 4 5 6 7 

转载于:https://www.cnblogs.com/m4ch0/p/7072023.html

利用std::allocator实现自定义的vector类相关推荐

  1. java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...

    利用axis2可以很方便的自动生成客户端代码,同时对复杂参数类型的传递也很方便,本文的服务端以.net开发,有一个自定义的实体类作为参数,客户端用java,简单介绍一下利用axis2的wsdl2jav ...

  2. C++ vector类详解

    转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...

  3. C++ vector 类学习笔记

    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...

  4. vector类 的属性和用法

    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...

  5. C++(19)--自定义Array,vector练习

    自定义Array,vector 1.自定义Array 2.自定义vector <老九学堂C++课程><C++ primer>学习笔记.<老九学堂C++课程>详情请到 ...

  6. 【C++入门】C++ vector类

    C++vector类 文章目录 C++vector类 一.vector定义 二.容器特性 1.顺序序列 2.动态数组 3.能够感知内存分配器的(Allocator-aware) 三.基本成员函数 1. ...

  7. c++ - 第9节 - vector类

    目录 1.标准库中的vector类 1.1.vector类 1.2.vector类的常用接口说明 1.3.vector类练习题 2.vector类的模拟实现 2.1.vector类源代码解析 2.2. ...

  8. C++初阶:vector类

    vector 0. vector的介绍 vector是用数组实现的.可变长度的顺序容器,本质是一种类模板. template < class T, // 元素类型class Alloc = al ...

  9. C++中std::allocator的使用

    标准库中包含一个名为allocator的类,允许我们将分配和初始化分离.使用allocator通常会提供更好的性能和更灵活的内存管理能力. new有一些灵活性上的局限,其中一方面表现在它将内存分配和对 ...

最新文章

  1. Linux NUMA 架构 :基础软件工程师需要知道一些知识
  2. ASP连接MYSQL问题点解决
  3. 常对象成员和常成员函数
  4. Hibernate 持久化状态、HQL语句大全(转)
  5. python tornado对接权限中心的sdk封装
  6. Soloπ:支付宝开源的Android专项测试工具
  7. 将DEX反编译成Java源代码
  8. 使用锚标记返回网页顶部的方法
  9. 【2011-2012 ACM-ICPC Pacific Northwest Regional Contest】Collateral Cleanup【建图拓扑排序】
  10. 测量系统分析方法(GRR Correlations Bias)
  11. android圆形头像边框,利用Android中BitmapShader制作自带边框的圆形头像
  12. oracle11g broker,张欣橙Oracle11g配置DGbroker
  13. HJ3 明明的随机数
  14. 【java】JavaFX从零开始实现拼图小游戏
  15. Qt 多国语言部分翻译不能成功加载的原因探索
  16. Python PYQT5中用Label控件显示以numpy表示的灰度图像
  17. Restful风格的验证码
  18. 小白科研笔记:理解PointConv和对此类方法感想
  19. CentOS安装 xmms
  20. 打造迪士尼梦幻体验的神奇魔法

热门文章

  1. go程序开发注意事项
  2. Spring Boot整合Apollo完整示例
  3. RocketMQ部署安装(非Docker安装)
  4. JVM 调优实战--什么是调优及如何调优的思路
  5. 可由一个尾指针唯一确定的链表有_2013-2014学年二学期数据结构期末考试试卷(3卷)...
  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
  7. Hikari连接池配多大合适
  8. 设计模式的理解:享元模式 (Flyweight)
  9. C++ :跳表数据结构的实现原理
  10. windows和linux主机名,windows和linux下如何远程获取操作系统版本和主机名