自制string类(支持宽字符) (一)

2014-11-24 01:34:34 · 作者: · 浏览: 3

说明:写此代码无其它用途,纯粹为了练练手,写了一点,觉得有必要拿来分享。

运用泛型的思想编写,若代码哪有地方你觉得不爽,请不吝指出。

string class referencs :http://www.cplusplus.com/reference/string/string/

欢迎学习交流!转载不忘注明出处(http://blog.csdn.net/zhanxinhang)^_^

头文件my_string.hpp

/*

*copy right by ZhanHang,2011.7

*E-mail:huaxin.turtle@gmail.com

*QQ:273711460

*Welcome To My Homepage(http://blog.csdn.net/zhanxinhang)!

*/

#ifndef MY_STRING_HPP

#define MY_STRING_HPP

#include

#include

#include

#include

template

class myString

{

public:

typedef charT* iterator;

private:

size_t M_length;

size_t M_storage_size;

iterator M_begin;

iterator M_end;

private://allocator

iterator alloc(size_t n);

public://constructor and destructor

myString(const charT*);

myString();

~myString();

public://operator=

myString& operator= (const myString&);

myString& operator= (const charT*);

myString& operator= (charT);

public://iterator

const iterator begin()const;

const iterator end()const;

public://capacity

const size_t size()const;

const size_t max_size()const;

void resize (size_t ,charT);

void resize (size_t n);

public://element access

charT& operator[](size_t);

public:// String operations

const charT* c_str()const;

size_t copy (charT* s, size_t n, size_t pos=0)const;

size_t find (const myString& str,size_t pos=0)const;

};//class myString

/////////////////

// constructor //

/////////////////

template

inline myString::myString(const charT* str)

:M_length(strlen((char*)str)/sizeof(charT)),

M_storage_size(M_length+M_length/5+1),

M_begin(alloc(M_storage_size)),

M_end(M_begin+M_length)

{

assert(M_length

strcpy((char*)M_begin,(char*)str);

*M_end='\0';

}

template

inline myString::myString()

:M_length(0),

M_begin(alloc(1)),

M_end(0)

{

*M_begin='\0';

}

////////////////

// destructor //

////////////////

template

inline myString::~myString()

{

free(M_begin);

}

///////////////

// operator= //

///////////////

template

inline myString& myString::operator= (const myString &str)

{

M_length=str.size();

assert(M_length

if(M_storage_size<=M_length)//动态分配存储空间

{

free(M_begin);

M_begin=alloc(M_length+M_length/5+1);

}

strcpy((char*)M_begin,(char*)str.c_str());

M_end=M_begin+M_length;

return *this;

}

template

inline myString& myString::operator= (const charT* pstr)

{

M_length=strlen((char*)pstr)/sizeof(charT);

assert(M_length

if(M_storage_size<=M_length)

{

free(M_begin);

M_begin=alloc(M_length+M_length/5+1);

}

strcpy((char*)M_begin,(char*)pstr);

M_end=M_begin+M_length;

return *this;

}

template

inline myString& myString::operator= (charT c)

{

M_length=1;

M_end=M_begin+M_length;

if(M_storage_size<=1)

{

free(M_begin);

M_begin=alloc(2);

}

*M_begin=c;

return *this;

}

//////////////

// iterator //

//////////////

template

inline const typename myString::iterator myString::begin()const

{

return M_begin;

}

template

inline const typename myString::iterator myString::end()const

{

return M_end;

}

//////////////

// capacity //

//////////////

template

inline const size_t myString::max_size()const

{

return size_t(-1) / sizeof(cha