模拟实现String类增删查改

来源:互联网 发布:linux配置密码怎么输入 编辑:程序博客网 时间:2024/04/27 17:39
String是C++中的重要类型,程序员在C++面试中经常会遇到关于String的细节问题,甚至要求当场实现这个类。只是由于时间关系,可能只要求实现构造函数、析构函数、拷贝构造函数等关键部分。

String的实现涉及很多C++的基础知识、内存控制及异常处理等问题,仔细研究起来非常复杂,本文主要做一个简单介绍和讲解模拟实现String类的增删查改。

class String{public:String(char *str = ""){_size = strlen(str);_capacity = _size;_str = (char*)malloc(strlen(str)+1);strcpy(_str,str);}void Swap(String& s){swap(_str,s._str);swap(_size,s._size);swap(_capacity,s._capacity);}//s1(s)String(String& s):_str(NULL){String tmp(s._str);Swap(s);}String& operator=(String s){Swap(s);return *this;}~String(){free(_str);}char* GetStr(){return _str;}size_t Size(){return _size;}size_t Capacity(){return _capacity;}//增删查改public:void PushBack(char ch){if(_size == _capacity){Expand(2*_size);}size_t end = _size;_str[end+1] = _str[end];_str[end] = ch;_size++;}void PushBack(const char* str){assert(str);size_t len = strlen(str);if((_size+len)>_capacity){Expand(_size+len);}size_t end = _size;_str[end+len] = _str[end];for(int i=0; i<(int)len;i++){_str[end+i] = str[i];}_size+=len;}void PopBack(char ch){if(_size == _capacity){Expand(2*_size);}int end = (int)_size;for(int i=end; i>=0; i--){_str[i+1] = _str[i];}_str[0] = ch;_size++;}void Insert(size_t pos, char ch){if(_size == _capacity){Expand(2*_size);}int end = (int)_size;for(int i=end; i>=(int)pos; i--){_str[i+1] = _str[i];}_str[pos] = ch;_size++;}void Insert(size_t pos, const char* str){assert(str);size_t len = strlen(str);if((_size+len)>_capacity){Expand(_size+len);}int end = (int)_size;for(int i=end; i>=(int)pos; i--){_str[i+len] = _str[i];}for(int i=0; i<(int)len; i++){_str[pos+i] = str[i];}_size+=len;}void Erase(size_t pos, size_t count){if((pos+count)>=_size){_str[pos] = '\0';}else{int end = int(_size);for(int i=(pos+count);i<=(int)end; i++){_str[i-count] = _str[i];}}_size-=count;}int Find(char ch) const{for(int i=0; i<=(int)_size; i++){if(ch==_str[i]){return i;}}return -1;}int Find(const char* str) const{const char *des = str;const char *src = _str;const char *tmp = src;int i = 0;assert(str);while(*src!='\0'){if(*des == *src){des++;if(*des == '\0'){return (tmp-_str);}src++;}else{tmp++;des = str;src = tmp;}}return -1;}char& operator[](size_t pos){return _str[pos];}bool operator<(const String& s) const{int i = 0;while(1){if((_str[i]=='\0')||(s._str[i]=='\0')){break;}if(_str[i]>s._str[i]){return false;}if(_str[i]==s._str[i]){++i;}if(_str[i]<s._str[i]){return true;}}if(_str[i]<s._str[i]){return true;}else{return false;}}bool operator<=(const String& s) const{return ((*this<s)||(*this==s));}bool operator>(const String& s) const{return !(*this<=s);}bool operator>=(const String& s) const{return !(*this<s);}bool operator==(const String& s) const{int i = 0;while(1){if((_str[i]=='\0')||(s._str[i]=='\0')){break;}if(_str[i]>s._str[i]){return false;}if(_str[i]==s._str[i]){++i;}if(_str[i]<s._str[i]){return false;}}if((_str[i]=='\0')&&(s._str[i]=='\0')){return true;}else{return false;}}bool operator!=(const String& s)const{return !(*this==s);}void Expand(size_t n){_str = (char*)realloc(_str,n+1);_capacity = n;if(_str==NULL){perror("void Expand(size_t n):");}}private:char* _str;size_t _size;//字符个数size_t _capacity;//容量空间};


原创粉丝点击