c++ STL string类仿写
来源:互联网 发布:网站域名后缀 编辑:程序博客网 时间:2024/05/01 02:29
最近看string类成员函数的时候,想着自己实现一下类似的字符串类。写了下,大体上粗略的实现了常见的函数,运算符等。有些函数没写重载形式了。主要是封装一个char* 指针,对其作操作.现在想想应该把增大容量的操作封装成一个函数调用,不用每次都实现。。。我是一个小菜鸟,如有错误多多指出。代码如下:
#include <iostream>#include <cstring>using namespace std;class MyString{public: class Iterator{ public: Iterator(MyString& ms):_ms(ms),_index(0){} Iterator(MyString& ms,int index):_ms(ms),_index(index){} Iterator(const Iterator& it):_ms(it._ms),_index(it._index){} ~Iterator(){} char& operator*(){return _ms[_index];} bool operator==(Iterator it){return _ms==it._ms&&_index==it._index;} bool operator!=(Iterator it){return !(_ms==it._ms&&_index==it._index);} Iterator operator++(){++_index;return *this;} Iterator operator+(int offset){Iterator it(_ms,_index+offset);return it;} Iterator operator++(int){Iterator it(_ms,_index);++_index;return it;} private: int _index; MyString& _ms; };public: MyString(); ~MyString(); MyString(const MyString& ms); MyString(const char* s); MyString(int n,char c); int length(){return _length;} int size(){return _length;} void clear(); bool empty(){return _length==0;} char& back(){return *_data;} char& front(){return *(_data+_length-1);} const char* data(){return _data;}; const char* c_str(){return _data;} int capacity(){return _capacity;} char& at(int); char& at(int)const; MyString& append(const MyString&); MyString& insert(int index,const MyString&); MyString& earse(int index,int len); void swap(MyString&); MyString substr(int index,int len); void reverse(); Iterator begin(); Iterator end(); char& operator[](int index); MyString operator+(MyString&); void operator+=(MyString&); void operator+=(const char*); void operator=(const char*); void operator=(const MyString&); friend ostream& operator<<(ostream&,MyString&); friend istream& operator>>(istream&,MyString&); friend bool operator==(MyString&,MyString&); friend void swap(MyString&,MyString&);private: char *_data; int _length; int _capacity; };MyString::Iterator MyString::begin(){ Iterator it(*this); return it;}MyString::Iterator MyString::end(){ Iterator it(*this,_length); return it;}ostream& operator<<(ostream& out,MyString& ms){ out<<ms._data; return out;}istream& operator>>(istream& in,MyString& ms){ char buffer[1024]; in>>buffer; ms._length=strlen(buffer); if(ms._capacity>ms._length){ strcpy(ms._data,buffer); } else{ while(ms._capacity<ms._length)ms._capacity*=2; delete ms._data; ms._data=new char[ms._capacity]; strcpy(ms._data,buffer); } return in;}void swap(MyString& ms1,MyString& ms2){ ms1.swap(ms2);}bool operator==(MyString& ms1,MyString& ms2){ if(strcmp(ms1._data,ms2._data)==0) return true; return false;}void MyString::reverse(){ char tmp; for(int i=0;i<_length/2;i++){ tmp=_data[i]; _data[i]=_data[_length-1-i]; _data[_length-i-1]=tmp; }}MyString MyString::substr(int index,int len){ if(index<0 || index>=_length)return *this; if(index+len>_length)len=_length-index; char *tmp=new char[len+1]; for(int i=index,j=0;i<index+len;i++){ tmp[j++]=_data[i]; } tmp[len]='\0'; MyString ms(tmp); delete tmp; return ms;}void MyString::swap(MyString& ms){ int t=_length; _length=ms._length; ms._length=t; t=_capacity; _capacity=ms._capacity; ms._capacity=t; char *p=_data; _data=ms._data; ms._data=p;}MyString& MyString::earse(int index,int len){ if(index<0 || index>=_length)return *this; if(index+len>_length)len=_length-index; for(int i=index+len;i<=_length;i++){ _data[i-len]=_data[i]; } return *this;}MyString& MyString::insert(int index,const MyString&ms){ if(index<0 || index>_length)return *this; _length=_length+ms._length; if (_capacity<=_length){ while(_capacity<=_length)_capacity*=2; char *tmp=new char[_capacity]; strncat(tmp,_data,index); strcat(tmp,ms._data); strcat(tmp,_data+index); delete _data; _data=tmp; } else{ char *tmp=new char[_length-index+1]; strcpy(tmp,_data+index); strcpy(_data+index,ms._data); strcat(_data,tmp); delete tmp; } return *this;}MyString& MyString::append(const MyString& ms){ _length=_length+ms._length; if (_capacity<=_length){ while(_capacity<=_length)_capacity*=2; char *tmp=new char[_capacity]; strcat(tmp,_data); strcat(tmp,ms._data); delete _data; _data=tmp; } else{ strcat(_data,ms._data); } return *this;}MyString::MyString():_data(new char('\0')),_length(0),_capacity(1){}MyString::MyString(const char* s):_capacity(1){ _length=strlen(s); while(_capacity<=_length)_capacity*=2; _data=new char[_capacity]; strcpy(_data,s);}MyString::MyString(const MyString& ms){ _length=ms._length; _capacity=ms._capacity; _data=new char[_capacity]; strcpy(_data,ms._data);}MyString::MyString(int n,char c):_length(n),_capacity(1){ while(_capacity<=_length)_capacity*=2; _data=new char[_capacity]; char *src=_data; while(n--){ *src++=c; } *src='\0'; }MyString::~MyString(){ if(_data!=NULL){ delete _data; _data=NULL; } _length=0; _capacity=0;}void MyString::clear(){ *_data='\0'; _length=0;}char& MyString::operator[](int index){ if(index<0 || index>=_length) return _data[_length]; return _data[index];}MyString MyString::operator+(MyString& ms){ MyString tmp; while(tmp._capacity<=_length+ms._length)tmp._capacity*=2; tmp._data=new char[tmp._capacity]; tmp._length=_length+ms._length; strcat(tmp._data,_data); strcat(tmp._data,ms._data); return tmp;}void MyString::operator+=(MyString& ms){ _length=_length+ms._length; if (_capacity<=_length){ while(_capacity<=_length)_capacity*=2; char *tmp=new char[_capacity]; strcat(tmp,_data); strcat(tmp,ms._data); delete _data; _data=tmp; } else{ strcat(_data,ms._data); }}void MyString::operator+=(const char* ms){ _length=_length+strlen(ms); if (_capacity<=_length){ while(_capacity<=_length)_capacity*=2; char *tmp=new char[_capacity]; strcat(tmp,_data); strcat(tmp,ms); delete _data; _data=tmp; } else{ strcat(_data,ms); }}void MyString::operator=(const char*ms){ _length=strlen(ms); if(_capacity<=_length){ while(_capacity<=_length)_capacity*=2; delete _data; _data=new char[_capacity]; } strcpy(_data,ms);}void MyString::operator=(const MyString& ms){ _length=strlen(ms._data); if(_capacity<=_length){ while(_capacity<=_length)_capacity*=2; delete _data; _data=new char[_capacity]; } strcpy(_data,ms._data);}char& MyString::at(int index){ if (index<0 || index>=_length){ return _data[_length]; } return _data[index];}char& MyString::at(int index)const{ if (index<0 || index>=_length){ return _data[_length]; } return _data[index];}int main(){ MyString ms="2121"; ms+="abc"; ms.append("789"); cout<<ms<<endl; ms.insert(0,"ABC"); ms=ms.substr(0,5); cout<<ms<<endl; for(MyString::Iterator it=ms.begin();it!=ms.end();++it) cout<<*it<<' '; cout<<endl; cout<<ms.length()<<" "<<ms.size()<<" "<<ms.capacity()<<endl; return 0;}//结果2121abc789ABC21A B C 2 1 5 5 16
1 0
- C++STL之string
- [C++]STL string类
- C++STL之string
- C++STL之string
- C++STL之string
- c++STL之string
- C++STL之string
- C++STL之string
- C++STL之string
- C++STL之string
- C++STL之string
- C++STL之string
- C++ STL string类型
- C++STL之string
- C++STL之string
- c++stl之string
- [C++] 详细解说STL string
- C++STL::string实例化
- Hudson-ci/Using Hudson/Installing Hudson/Installing Hudson DEB
- 校门外的树
- java mysql 中文查询
- iOS开发---计算两个日期的时间差
- java堆栈类解决括号匹配问题
- c++ STL string类仿写
- java之android真机调试
- 51nod 1072 威佐夫游戏
- 【NOI 2014】起床困难综合征 拆位+贪心
- 设计模式之访问者模式
- Socket编程中的inputstream阻塞问题
- 阿里云centos7搭建web开发环境mysql5.6+php7+apach
- 利用第三方软件打包C++程序,其中包含了大量第三方库
- HDFS文件内容追加(Append)