c++写的一个简单的string类

来源:互联网 发布:神作小说 知乎 编辑:程序博客网 时间:2024/06/06 13:24
这是刚开始学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;elsereturn 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;elsereturn 0;}mystring operator+(const mystring& left,const mystring& right){mystring r=left;r+=right;return r;}}//the end of namespace mstr#endif

原创粉丝点击