C++ String的增删查改

来源:互联网 发布:上海卷烟销售网络 编辑:程序博客网 时间:2024/04/27 17:44


#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;class String{public:String(char* str = ""):_str(new char[strlen(str)+1]),_size(strlen(str)),_capacity(strlen(str)){strcpy(_str, str);}String(const String& s):_str(NULL),_size(strlen(s._str)),_capacity(strlen(s._str)){String tmp(s._str);swap(_str, tmp._str);}String& operator =(String s){swap(_str, s._str);_size = s._size;_capacity = s._capacity;return *this;}//增删查改void PushBack(char ch){GetExpand(_size+1);_str[_size] = ch;_str[++_size] = '\0';}void PushBack(const char* str){GetExpand(_size+strlen(str));strcpy(_str+_size, str);_size += strlen(str);_str[_size] = '\0';}void PopBack(){_str[_size-1] = '\0';_size--;}void Insert(size_t pos, char ch){GetExpand(_size+1);int end = _size;while(end >= (int)pos)//思考:这里是从'\0'开始移动的{_str[end+1] = _str[end];end--;}_str[pos] = ch;_size++;}void Insert(size_t pos, const char* str){size_t len = strlen(str);GetExpand(_size + len);int end = _size;while(end > (int)pos){_str[end+1] = _str[end];end--;}strcpy(_str+pos, str);_size += len;}void Erase(size_t pos, size_t count){int start = pos;int end = pos + count;while(_str[end]){_str[start++] = _str[end++];}_str[start] = '\0';//这里的start已经是_str的最后位置_size -= count;}int Find(char ch)const {int i = 0;while(_str[i] != '\0'){if(_str[i++] == ch)return i-1;}return -1;}int Find(const char* str)const{size_t len = strlen(str);size_t i = 0;char* src_index = _str;char* dest_index = (char*)str;char* tmp_index = NULL;while((_size-i) >= len){src_index = _str + i;if(*src_index == *dest_index){tmp_index = dest_index;while((*tmp_index++) == (*src_index++)){if((*src_index == '\0') || (*tmp_index == '\0'))return i;}}i++;}return -1;}char& operator [](size_t pos){return _str[pos];}bool operator >(const String& s)const{if(strcmp(_str, s._str) > 0)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{if(strcmp(_str, s._str) == 0)return true;elsereturn false;}bool operator !=(const String& s)const{return !((*this) == s);}void GetExpand(size_t n){if(n >= _capacity)//这里是需要多少给你分配多少,也可以一次多分配点空间提高效率{char* tmp = new char[n+1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void GetStr(){cout<<_str<<endl;}private:char* _str;size_t _size;//字符个数size_t _capacity;//容量};
测试用例

int main(){String s1("hello");String s2(s1);s2.PushBack(" ");s2.PushBack("world1");s1.GetStr();s2.GetStr();String s3;s3 = s1;s3.GetStr();s3.PushBack(" world2");s3.GetStr();s3.PopBack();s3.GetStr();String s4("hell 3");s4.Insert(4, 'o');s4.GetStr();s4.Insert(6, "world");s4.GetStr();s4.Erase(0, 6);s4.GetStr();String s5("hello world4");cout<<s5.Find(' ')<<endl;cout<<s5.Find('*')<<endl;String s6("aabbbcdde");cout<<s6.Find("bcdsdjgsdfjgldsjfgldskf")<<endl;cout<<s6.Find("BCD")<<endl;cout<<s6.operator[](4)<<endl;String s7("aabbcdde");cout<<(s6!=s7)<<endl;cout<<(s6>s7)<<endl;cout<<(s6<s7)<<endl;return 0;}