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;