【C++】实现STL模板类string
2015-09-05 20:16
411 查看
#include<String> #include <iostream> using namespace std; class String { public: String() { _str = new char[1]; _str[0] = '\0'; _size = 0; _capacity = 1; } String(const char* str) { _size = strlen(str); _capacity = strlen(str)+1; _str = new char[strlen(str)+1]; strcpy(_str,str); } ~String() { if(_str) { cout<<"析构"<<endl; delete []_str; } } String(const String& str) { _str = new char [strlen(str._str) + 1]; strcpy(_str,str._str); _size = str._size ; _capacity = str._capacity ; } String& operator=(const String& str) { if(this != &str) { delete _str; _str = new char[strlen(str._str) + 1]; strcpy(_str,str._str); _size = str._size ; _capacity = str._capacity ; } return *this; } public: const char* GetStr() { return _str; } void _CheckCapacity(size_t capacity) { if(_capacity < (capacity +_capacity)) { _capacity *= 2; char* tmp = new char[_capacity]; strcpy(tmp,_str); delete []_str; _str = tmp; } } void PushBack(char ch) { _CheckCapacity(1); _str[_size] = ch; _size++; _str[_size] = '\0'; } void PopBack() { if(_str) { _str[_size - 1] = '\0'; _size--; } else { cout<<"您要删除的节点不存在"<<endl; } } void Insert(size_t pos, const char ch) { int tmp2 = _capacity; int tmp = _size; _CheckCapacity(1); while(tmp2 != pos) { _str[tmp] = _str[tmp-1]; tmp--; tmp2--; } _str[_size + 1] = '\0'; _size++; _str[ pos -1] = ch; } void Insert(int pos, const char* str) { int len = strlen(str); _CheckCapacity(_size + len + 1); int i = _size; int j = _size + len; for(; i>=pos ;) { _str[j--] = _str[i--]; } while(*str) { _str[pos++] = *str++; } _size += len; _str[_size] = '\0'; } int Find(char ch) { char* tmp = _str; while(*tmp) { if(*tmp == ch) { return 1; } tmp++; } return 0; } int Find(const char* str) { const char* src = _str; const char* sub = str; int srclen = strlen(src); int sublen = strlen(sub); if(sublen > srclen) { return -1; } int srcIndex = 0; while(srcIndex <= srclen - sublen) { int i = srcIndex, j = 0; while(i < srclen && j<sublen && src[i]==sub[j]) { ++i; ++j; } if(j == sublen) { return srcIndex; } ++srcIndex; } return -1; } public: // 不能用C库的函数 bool operator<(const String & s) { const char* str1 = _str; const char* str2 = s._str; while(*str1 && *str2) { if(*str1 < *str2) { return true; } else if(*str1 > *str2) { return false; } else { str1++; str2++; } } if(*str1) { return false; } if(*str2) { return true; } } bool operator>(const String & s) { return !(this<s._str ||this == s._str); } bool operator<=(const String & s) { return !(this>s._str); } bool operator>=(const String & s) { return !(this<s._str); } bool operator==(const String & s) { const char* str1 = _str; const char* str2 = s._str; while(*str1 && *str2) { if(*str1++ != *str2++) { return false; } } if(*str1 == *str2)//比较'\0' { return true; } else return false; } String operator+(const String& s) { /* String tmp(_str); char* str = s._str; while (*str) { tmp.PushBack(*str++); }*/ String tmp(_str); tmp.Insert(_size, s._str); return tmp; } String operator+=(const String & s) { Insert(_size,s._str); return *this; } friend ostream& operator<<(ostream& os, const String& s) { os<<s._str; return os; } friend istream& operator>>(istream& is, String& s); private: size_t _size; // 大小 size_t _capacity; // 容量 char* _str; // 指向字符串的指针 }; ostream& operator<<(ostream& os, const String& s) { os<<s._str; return os; } istream& operator>>(istream& is, String& s); void Test1() { String s1; String s2("abcd"); /*String s3("efgh"); s3 = s2; s3.PushBack('x'); s3.PopBack();*/ /*s2.Insert(2,'x'); cout<<s2<<endl;*/ s2.Insert(2,"efg"); cout<<s2<<endl; } void Test2() { String s1("abcd"); int ret = s1.Find('e'); cout<<ret<<endl; } int main() { Test1(); //Test2(); getchar(); return 0; }
相关文章推荐
- 【C++】双向链表的实现
- 学生成绩排名(C语言编写)
- C++11 常量表达式
- 【C++】this指针
- 【C++】各种成员变量
- 乘积最大子序列
- VC++ 结束线程 AfxBeginThread AfxEndThread
- C++顺序容器
- C++IO库
- C++ 11 Lambda表达式
- C语言的关键字“volatile"有何作用?
- 《Effective C++》学习笔记——条款34
- 杨辉三角纯数学C语言实现
- c++ std::getline
- c++内存分配优先使用内存池,而不是new,delete
- 数字三角形
- c++中的语法结构
- C++虚函数的工作原理是什么
- C++中随机函数rand()和srand()的用法
- 【C++】const、volatile不能修饰没有this指针的成员函数