说明:写此代码无其它用途,纯粹为了练练手,写了一点,觉得有必要拿来分享。
运用泛型的思想编写,若代码哪有地方你觉得不爽,请不吝指出。
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
: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 :M_length(0), M_begin(alloc(1)), M_end(0) { *M_begin='\0'; } //////////////// // destructor // //////////////// template inline myString { free(M_begin); } /////////////// // operator= // /////////////// template inline myString { 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 { 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 { 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 { return M_begin; } template inline const typename myString { return M_end; } ////////////// // capacity // ////////////// template inline const size_t myString { return size_t(-1) / sizeof(cha