这是刚开始学c++时候写的一个string类,有些细节还值得推敲,一直没时间重写写过,放在这以后再改改
#ifndef _MYSTRING_H
#define _MYSTRING_H
#include<cctype>
#include<algorithm>
#include<vector>
#include<cassert>
namespace mstr
{
class mystring
{
public:
typedef unsigned int size_type;
mystring(){};
mystring(size_type n,char c):data(n,c){}
mystring(const char* cp);
~mystring();
size_type size()const{return data.size();}
char& operator[](size_type i);
const char& operator[](size_type i)const;
friend std::istream& operator>>(std::istream&,mystring&);
friend std::ostream& operator<<(std::ostream&,const mystring&);
mystring& operator+=(const mystring&);
mystring getSub(size_type sBegin,size_type Len);
const mystring getSub(size_type sBegin,size_type Len)const;
const char* c_str()const;
bool hasSub(const mystring&sub);
bool operator<(const mystring&ls)const;
private:
std::vector<char> data;
};
mystring::mystring(const char* cp)
{
int i=0;
while(cp[i]!='\0'&&++i);
assert(cp[i]=='\0');
std::copy(cp,cp+i,std::back_inserter(data));
}
char& mystring::operator[](size_type i)
{
return data[i];
}
const char& mystring::operator[](size_type i)const
{
return data[i];
}
mystring& mystring::operator+=(const mystring&s)
{
std::copy(s.data.begin(),s.data.end(),std::back_inserter(data));
return *this;
}
bool mystring::operator<(const mystring&ls)const
{
size_type i=0;
for(;i!=size()&&i!=ls.size();i++)
{
if(data[i]==ls[i])
continue;
else if(data[i]>ls[i])
return false;
else
return true;
}
if(i==ls.size()&&i!=size())
return true;
else return false;
}
mystring mystring::getSub(size_type sBegin,size_type Len)
{
mystring sub;
if(sBegin+Len>=size())
return 0;
for(size_type i=0;i!=Len;i++)
sub[i]=data[i+sBegin];
return sub;
}
const mystring mystring::getSub(size_type sBegin,size_type Len)const
{
mystring sub;
if(sBegin+Len>=size())
return 0;
for(size_type i=0;i!=Len;i++)
sub[i]=data[i+sBegin];
return sub;
}
const char* mystring::c_str()const//?????????
{
size_type len=size()+1;
char *str=new char[len];
for(size_type i=0;i!=len-1;i++)
{
str[i]=data[i];
}
str[len-1]='\0';
return str;
}
bool mystring::hasSub(const mystring& sub)
{
if(sub.size==0)
return true;
size_type i=0,j=0;
while(i!=size())
{
while(data[i]==sub[j])
{
i++;
j++;
if(j==sub.size())
return true;
if(i==size())
return false;
}
i++;
}
return false;
}
mystring::~mystring()
{
}
std::ostream& operator<<(std::ostream& os,const mystring& s)
{
for(mystring::size_type i=0;i!=s.size();i++)
os<<s[i];
return os;
}
std::istream& operator>>(std::istream& is,mystring& s)
{
s.data.clear();
char c;
while(is.get(c)&&isspace(c));
if(is)
{
do s.data.push_back(c);
while(is.get(c)&&!isspace(c));
}
return is;
}
int cmp(const mystring&s1,const mystring& s2)
{
if(s1<s2)
return -1;
else if(s2<s1)
return 1;
else
return 0;
}
mystring operator+(const mystring& left,const mystring& right)
{
mystring r=left;
r+=right;
return r;
}
}//the end of namespace mstr
#endif