String类

来源:互联网 发布:水利水电造价软件 编辑:程序博客网 时间:2024/06/14 07:33
#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>#include <assert.h>using namespace std;class String{public:String(const char *str = " "):_str(new char[strlen(str)+1]),_size(strlen(str)),_capacity(_size){strcpy(_str, str);}//String(const String& s)//{//传统写法//_str = new char[strlen(s._str)+1];//strcpy(_str, s._str);//}String(const String& s)//现代写法:_size(strlen(s._str)+1),_capacity(strlen(s._str)+1),_str(new char[strlen(s._str)+1]){String tmp(s._str);swap(tmp._str, _str);}String& operator=(const String& s){if(this != &s){delete[] _str;_str = new char[strlen(s._str)+1];_size = s._size;_capacity = s._capacity;strcpy(_str, s._str);}return *this;}//String& operator=(String s)//{//swap(_str, s._str);//return *this;//}~String(){delete[] _str;_str = NULL;}void Display(){cout<<_str<<endl;}void Expand(size_t n){if(n > _capacity){ _str = (char *)realloc(_str, 1+n);}_capacity = n;}void pushback(char ch){if(_size == _capacity){Expand(_capacity*2);}_str[_size] = ch;++_size;_str[_size] = '\0';}void pushback(const char *str){size_t len = strlen(str);if(_size == _capacity){Expand(len+_size);}strcat(_str, str);_size += len;}void popback(){assert(_size);_str[_size-1] = '\0';}void Insert(size_t pos, char ch)//在POS位置处插一个字符ch{if(_size = _capacity){Expand(_capacity*2);}int end = _size;while((size_t)end >= pos){_str[_size+1] = _str[end];--end;}_str[pos] = ch;++_size;}void Insert(size_t pos, const char *str)//在pos位置插一个str字符串{int len = strlen(str);assert(str);if(_size+len > _capacity){Expand(_size+len);}int end = _size;while((size_t)end >= pos){_str[end+len] = _str[end];--end;}/*while(*str){_str[pos++] = *str++;}*/memcpy(_str+pos,str,strlen(str));_size += len;}void Erase(size_t pos, size_t count)//在pos位置删除count个字符{if(pos+count > _size-1){_str[pos] = '\0';_size = pos;}else{strcpy(_str+pos, _str+pos+count);_size -= count;}}size_t Find(char ch)const{size_t count = 0;while(count < _size){if(_str[count] == ch){return count;}++count;}return -1;}size_t Find(const char *str)const{assert(str);size_t s1 = 0;size_t s2 = 0;while(s1 < _size){size_t s1_tmp = s1;while(_str[s1_tmp] == str[s2]){++s1_tmp;++s2;if(str[s2]){return s1;}}++s1;s2 = 0;}return -1;}char& operator[](size_t pos)//给[]里填一个数字就会返回对应的字母{assert(pos < _size);return _str[pos];}bool operator<(const String& s)const{//先比较第一位的大小size_t i = 0;for(i=0; i<_size&&i<s._size; i++){if(_str[i] < s._str[i]){return true;}}if(i == _size && i != s._size)return true;elsereturn 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{return !(*this == s);}bool operator==(const String& s)const{size_t i = 0;while(_str[i] == s._str[i]){++i;if(i==strlen(_str)||i==strlen(s._str))break;}if(i == strlen(_str) && i == strlen(s._str))return true;else{return false;}}private:char *_str;size_t _size;size_t _capacity;};int main(){String s1("hello world");String s2("hello world");//s1.pushback(" nihaonihao");//s1.Display();//s1.popback();//s1.Display();//s1.Insert(4, "o ");//s1.Erase(0, 10);//size_t ret = s1.Find('d');//cout<<ret<<endl;//size_t ret = s1.Find("wor");//cout<<ret<<endl;//char ret = s1.operator[](3);//cout<<ret<<endl;//bool ret = s1<s2;//bool ret =(s1==s2);bool ret = (s1 != s2);cout<<ret<<endl;s1.Display();system("pause");return 0;}