您的位置:首页 > 其它

STL中设计一个简单的空间配置器

2013-06-16 15:24 537 查看
在STL中设计了一个默认的空间配置器来负责内存的申请与释放,因此在每种容器中比如vector中如果不显示的指定使用何种空间配置器将调用默认的空间配置器,一般通用的代码如下:

#include<vector>

#include<iostream>

using namespace std;

int main(){

int ia[]={0,1,5,3,4};

unsigned int i;

vector<int > iv(ia,ia+5);

for(i=0;i<iv.size();i++){

cout<<iv[i]<<" ";

}

cout<<endl;

return 0;

}

在上述代码中将使用默认的空间配置器std::allocator,除了使用默认的空间配置器外还可以自己完成。根据STL规范,allocator的必要接口,完成一个简单的空间配置器如下:

/*

* 2jjalloc.h

*

* Created on: 2013-6-15

* Author: mwjsolar

*/

#ifndef _2JJALLOC_H_

#define _2JJALLOC_H_

#include<new>

#include<cstddef>

#include<cstdlib>

#include<climits>

#include<iostream>

#include<memory>

using namespace std;

namespace JJ{

template<class T>

inline T* _allocate(ptrdiff_t size,T*){

set_new_handler(0);

T* tmp=(T*)(::operator new ((size_t)(size*sizeof(T))));

if(tmp==0){

cerr<<"out of memory "<<endl;

exit(1);

}

return tmp;

}

template<class T>

inline void _deallocate(T* buffer){

::operator delete (buffer);

}

template <class T1,class T2>

inline void _construct(T1* p,const T2& value){

new(p) T1(value);

}

template <class T>

inline void _destroy(T* ptr){

ptr->~T();

}

template<class T>

class allocator{

public:

typedef T value_type;

typedef T* pointer;

typedef const T* const_pointer;

typedef T& reference;

typedef const T& const_reference;

typedef size_t size_type ;

typedef ptrdiff_t difference_type;

template<class U>

struct rebind{

typedef allocator<U> other;

};

pointer allocate(size_type n,const void *hint=0){

return _allocate((difference_type)n,(pointer)0);

}

void deallocate(pointer p,size_type n){

_deallocate(p);

}

void construct(pointer p,const T& value){

_construct(p,value);

}

void destroy(pointer p){

_destroy(p);

}

pointer address(reference x){

return (pointer)&x;

}

const_pointer const_address(const_reference x){

return (const_pointer)&x;

}

size_type max_size()const{

return size_type(UINT_MAX/sizeof(T));

}

};

}

#endif /* 2JJALLOC_H_ */

cpp文件如下:

/*

* 2jjalloc.cpp

*

* Created on: 2013-6-15

* Author: mwjsolar

*/

#include"2jjalloc.h"

#include<vector>

#include<iostream>

using namespace std;

/*

* 2jjalloc.h

*

* Created on: 2013-6-15

* Author: mwjsolar

*/

int main(){

int ia[]={0,1,5,3,4};

unsigned int i;

vector<int ,JJ::allocator<int> > iv(ia,ia+5);

for(i=0;i<iv.size();i++){

cout<<iv[i]<<" ";

}

cout<<endl;

return 0;

}

将vector中的参数设为JJ::allocator<int>,调用自定义的空间配置器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: