利用std::allocator实现自定义的vector类
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类相关推荐
- java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...
利用axis2可以很方便的自动生成客户端代码,同时对复杂参数类型的传递也很方便,本文的服务端以.net开发,有一个自定义的实体类作为参数,客户端用java,简单介绍一下利用axis2的wsdl2jav ...
- C++ vector类详解
转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...
- C++ vector 类学习笔记
vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...
- vector类 的属性和用法
vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...
- C++(19)--自定义Array,vector练习
自定义Array,vector 1.自定义Array 2.自定义vector <老九学堂C++课程><C++ primer>学习笔记.<老九学堂C++课程>详情请到 ...
- 【C++入门】C++ vector类
C++vector类 文章目录 C++vector类 一.vector定义 二.容器特性 1.顺序序列 2.动态数组 3.能够感知内存分配器的(Allocator-aware) 三.基本成员函数 1. ...
- c++ - 第9节 - vector类
目录 1.标准库中的vector类 1.1.vector类 1.2.vector类的常用接口说明 1.3.vector类练习题 2.vector类的模拟实现 2.1.vector类源代码解析 2.2. ...
- C++初阶:vector类
vector 0. vector的介绍 vector是用数组实现的.可变长度的顺序容器,本质是一种类模板. template < class T, // 元素类型class Alloc = al ...
- C++中std::allocator的使用
标准库中包含一个名为allocator的类,允许我们将分配和初始化分离.使用allocator通常会提供更好的性能和更灵活的内存管理能力. new有一些灵活性上的局限,其中一方面表现在它将内存分配和对 ...
最新文章
- Linux NUMA 架构 :基础软件工程师需要知道一些知识
- ASP连接MYSQL问题点解决
- 常对象成员和常成员函数
- Hibernate 持久化状态、HQL语句大全(转)
- python tornado对接权限中心的sdk封装
- Soloπ:支付宝开源的Android专项测试工具
- 将DEX反编译成Java源代码
- 使用锚标记返回网页顶部的方法
- 【2011-2012 ACM-ICPC Pacific Northwest Regional Contest】Collateral Cleanup【建图拓扑排序】
- 测量系统分析方法(GRR Correlations Bias)
- android圆形头像边框,利用Android中BitmapShader制作自带边框的圆形头像
- oracle11g broker,张欣橙Oracle11g配置DGbroker
- HJ3 明明的随机数
- 【java】JavaFX从零开始实现拼图小游戏
- Qt 多国语言部分翻译不能成功加载的原因探索
- Python PYQT5中用Label控件显示以numpy表示的灰度图像
- Restful风格的验证码
- 小白科研笔记:理解PointConv和对此类方法感想
- CentOS安装 xmms
- 打造迪士尼梦幻体验的神奇魔法
热门文章
- go程序开发注意事项
- Spring Boot整合Apollo完整示例
- RocketMQ部署安装(非Docker安装)
- JVM 调优实战--什么是调优及如何调优的思路
- 可由一个尾指针唯一确定的链表有_2013-2014学年二学期数据结构期末考试试卷(3卷)...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
- Hikari连接池配多大合适
- 设计模式的理解:享元模式 (Flyweight)
- C++ :跳表数据结构的实现原理
- windows和linux主机名,windows和linux下如何远程获取操作系统版本和主机名