c++ stl的复用

 

1.大小写不敏感的string类..

可以看一下char_traits的定义,仿照定义一个自己的模版类,

改写

static bool __cdecl eq(const _Elem& _Left, const _Elem& _Right)
 { 
  if(_Left == _Right) return true;
  else{
   _Elem maxElem = max(_Left, _Right);
   _Elem minElem = (_Left+_Right)-maxElem;
   if(maxElem>='a' && maxElem<='z' && maxElem-minElem==32) return true;
   else return false;
  }
 }

就可以了,compare要用默认的函数,不能用特例化的函数

然后自定义
typedef basic_string<char, my_char_traits<char>, allocator<char> >
my_string;即可

如果是宽字符串,基本同上

2.自定义的tree内存管理

适用于所有由_Tree派生的类,主要是一下4个:map,multmap,set,multset

 当你的map大小一直都在一个有限个数范围内的时候,可以考虑用该管理类去管理内存



struct _TyList
{
 _TyList* _next;
};
//只支持一次分配一个,如果想一次分配多个,仿照这个例子做适当改动即可...
template<class _Ty>
class my_allocator
 : public _Allocator_base<_Ty>

 
....
private:
 enum
 {
  BLOCK_SIZE = 100 //每块大小(byte)

 };
 static _TyList*   m_ListHead;

......

 //重写
 void deallocate(pointer _Ptr, size_type)
 { 
  _TyList* _pTemp = (_TyList*)_Ptr;
  _pTemp->_next = m_ListHead;
  m_ListHead = _pTemp;
  _PrintAllMemory();
 }

 //重写
 pointer allocate(size_type _Count)
 { 
  
  if(NULL == m_ListHead){

   size_type _szTy = max(sizeof(_Ty), sizeof(pointer));
   char* _data = ::new char[BLOCK_SIZE*_szTy];
   m_ListHead = (_TyList*)(_data+_szTy);
   _TyList* _pNowList = m_ListHead;
   for(int i=2; i<BLOCK_SIZE; _pNowList =_pNowList->_next, ++i)
    _pNowList->_next = (_TyList*)(_data+i*_szTy);
   _pNowList->_next = NULL;
   _PrintAllMemory();
   return (pointer)_data;
  }

  _TyList* _pTemp = m_ListHead;

  m_ListHead = m_ListHead->_next;
  _PrintAllMemory();
  return (pointer)_pTemp;

 }

//重写

 _SIZT max_size() const
 { 
  return (_SIZT)BLOCK_SIZE;
 }
};

 

使用的时候只需要把my_allocator设置成自己的内存管理类就可以了..

比如:

typedef int my_test_type;

typedef

map<my_test_type ,my_test_type,less<my_test_type>,

my_allocator<pair<my_test_type, my_test_type> > >  MY_MI2I;
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值