利用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 
时间: 2024-12-20 20:02:37

利用std::allocator实现自定义的vector类的相关文章

python利用企业微信api来进行发送自定义报警的类实现

python利用企业微信api来进行发送自定义报警的类实现 企业微信注册 打开http://work.weixin.qq.com/企业微信主页: 点击企业注册: 填写相关信息,营业执照和注册号可以不用填,直接下一步,按照提示操作即可: 注册完成后,登陆,就显示如下界面: 点击我的企业标签: 看到如上界面,复制CorpID对应的值: 点击企业应用: 点击 创建应用: 填写对应内容,点击创建应用即可: 然后再点击企业应用,就可以在自建应用里看到自己创建的应用: 点击应用图标,看到如下图 复制Agen

C++ vector类详解

转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了:而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量. vector的扩充机制:按照容器现在容量的一倍进行增长.vecto

强大而好用的vector类------载自他处

vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了:而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量. vector的扩充机制:按照容器现在容量的一倍进行增长.vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请

自定义结构或类的比较

存放在数组或vector中的排序: 定义普通函数: 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 struct act{ 5 int num; 6 int s; 7 int e; 8 }; 9 bool lessact(const act& a1,const act &a2){ 10 return a1.e<a2.e; 11 } 12 int main() { 13

vector类转换Mat类

前言 一个个数据push back到vector之后,可以使用Mat()函数将vector类型转换为Mat类型. 在opencv中Mat类的构造函数中有一个构造函数可以直接把vector类转换为Mat类. 代码: std::vector<int> responses; cv::Mat tres; tres = Mat(responses, true);//vector2mat 该构造函数的定义如下(在mat.hpp文件中): template<typename _Tp> inlin

stl vector 类

目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此参数描述了向量的初始大小. 说明 vector是一种动态数组,是基本数组的类模板.其内部定义了很多基本操作. #include <vector> 注意:头文件没有“.h”构造: 这个构造函数还有一个可选的参数,这是一个类型为T的实例,描述了各个向量种各成员的初始值: 如:vector<int

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

遵照std::allocator实现自定制的内存分配器

下面是标准库STL中allocator的实现 template<class _Ty> class allocator : public _Allocator_base<_Ty> { // generic allocator for objects of class _Ty public: typedef allocator<_Ty> other; typedef _Allocator_base<_Ty> _Mybase; typedef typename _

C++ std::allocator&lt;T&gt;使用

基础知识通道:http://blog.csdn.net/Xiejingfa/article/details/50955295 C/C++: 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 5 #define allocate_length 100000 6 7 8 int main() 9 { 10 11 //allocator比new快的原因:分离分配和初始化这两个操作allocator少