这里需要的基础知识主要是类模板和函数模板,以及一个C++内存分配的技术allocator类,它提供可感知类型的内存分配,这个类支持一个抽象接口,以分配内存并随后使用该内存保存对象。
使用allocator类,首先应用allocator类建立一个allocator对象,然后使用该对象你可以分配内存,释放内存,构造你需要的对象,释放不要的对象。
template<class T>allocator<T> Vector<T>::alloc;这句必须存在,就是生成一个allocator对象,不过在类定义时就已经实现了。没有这句在vs2010上会编译不通过,原因不清楚.
//test.h #ifndef MYVECTOR_H #define MYVECTOR_H #include<memory> #include<cstddef> using namespace std; template<class T>class Vector { public: //默认构造函数 Vector():elements(0),first_free(0),end(0){} void push_back(const T&); //返回Vector的大小 size_t size() { return first_free-elements; } //返回Vector的容量 size_t capacity() { return end-elements; } private: static std::allocator<T> alloc;//所有的Vector都用这个配置器,一个对象,用来获取原始的没有构造对象的内存 void reallocate(); T* elements; T* first_free; T* end; }; template<class T>allocator<T> Vector<T>::alloc; //往容器后面加入元素 template<class T> void Vector<T>::push_back(const T&t) { //还有空间吗? if(first_free==end) reallocate();//没有了就重新分配 alloc.construct(first_free,t);//还有就用t构造一个新对象 ++first_free; } template<class T> void Vector<T>::reallocate() { //计算当前已用空间的大小 //ptrdiff_t类型变量通常用来保存两个指针减法操作的结果,这是一种与机器无关的类型 std::ptrdiff_t size = first_free - elements; //分配新的空间大小为原来元素个数的两倍 std::ptrdiff_t newcapacity = 2 * max(size,1); //为容器分配新的空间,大小为newcapacity个T类型的元素,newelements指向新空间的首地址 T* newelements = alloc.allocate(newcapacity); //把原来的元素复制到新的内存空间,把从elements开始到first_free的元素复制到从newelements开始的空间 //该函数在目的地构造元素,而不是给他们赋值,因为剩余的空间不进行初始化。 uninitialized_copy(elements,first_free,newelements); //反序调用析构函数释放原来的内存空间里的对象 for(T *p=first_free;p!=elements;/*empty*/) alloc.destroy(--p); //不能释放空指针 if(elements) alloc.deallocate(elements,end-elements);//释放原来的内存空间 //指针指向现在的空间 elements=newelements; first_free=elements+size; end=elements+newcapacity; } #endif
上面就是完整的Vector容器的建立,只提供一个功能,往容器加入元素,然后我们运行下面的函数来检查内存的占用情况,来检验我们是否正确实现了该容器。
#include"test.h" #include<iostream> using namespace std; void main() { Vector<int> a; cout<<"Vector已经空间: "<<a.size()<<endl; cout<<"Vector总容量: "<<a.capacity()<<endl; cout<<"Vector容器占用空间:"<<sizeof(a)<<endl; }
输出结果
Vector已经空间: 0
Vector总容量: 0
Vector容器占用空间:12
请按任意键继续. . .
那么我们再让容器 添加一个元素
Vector已经空间: 1
Vector总容量: 2
Vector容器占用空间:12
请按任意键继续. . .
再让容器 添加一个元素
Vector已经空间: 2
Vector总容量: 2
Vector容器占用空间:12
请按任意键继续. . .
再让容器 添加一个元素
Vector已经空间: 3
Vector总容量: 4
Vector容器占用空间:12
请按任意键继续. . .
原文地址:http://blog.csdn.net/u013011841/article/details/40379165