C++ 模拟String类 相关
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 模拟String类 相关相关的知识,希望对你有一定的参考价值。
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <cassert> using namespace std; //string 编写 /*版本1 以前的版本*/ /*************** class String { public: //错误 String(char *str = NULL) String(char *str = "") :_str(new char[strlen(str) + 1]) { } String(const String& str) { _str = new char[strlen(str._str) + 1]; strcpy(_str, str._str); } String& operator=(const String& str) { if(this != &str)//防止出错 不光是效率 { delete[] _str;//防止内存泄漏 _str = new char[strlen(str._str) + 1]; strcpy(_str, str._str); } return *this; } ~String() { if(_str != NULL) { delete[] _str; _str = NULL; } } private: char* _str; }; **************/ //########################################## #if 0 /*版本2 string()*/ class String { public: String(char *str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } String(const String& str) :_str(NULL) { String tmp(str._str); swap(_str, tmp._str); } ~String() { if(_str != NULL) delete[] _str; } String& operator=(const String &str) { if(this != &str) { String tmp(str); swap(_str, tmp._str); } return *this; } public: bool operator==(String &s) { assert(_str); assert(s._str); while(*(_str) == *(s._str)) { if(_str == ‘\0‘) return true; _str++; s._str++; } return false; } bool operator>(String &s) { assert(_str); assert(s._str); while(*(_str) == *(s._str)) { if(_str == ‘\0‘) return false; _str++; s._str++; } return (*_str - *(s._str) > 0 ?true :false); } bool operator<(String &s) { return !(*this > s || *this == s); } public: /* 自己的 不是很好 */ /******************************** void insert(int pos, char ch) { char* str = _str; int len = strlen(str) + 2; char* new_p = new char[len]; char* p = new_p; int i = 0; for(i = 0; i < pos - 1; i++) { *p = *(str); p++; str++; } *p++ = ch; for(i = pos; i < len; i++) { if(*str == ‘\0‘) { break; } *p = *(str); p++; str++; } swap(_str, new_p); delete[] new_p; } ************************************/ public: void insert(int pos, char ch) {} private: char *_str; }; #endif //########################################## /******************************** * 简单实现String类 部分函数 * String& operator=(String str) * String& operator>(String str) * String& operator<(String str) * void insert(int pos, char* str) * void insert(int pos, const String& str) * void PushBack(int ch) * void insert(int pos, char ch) ********************************/ class String { #define MORE_CAPACITY 10 public: String(char* str = "") :_str(new char[strlen(str) + MORE_CAPACITY]) ,_len(strlen(str)) ,_capacity(strlen(str) + MORE_CAPACITY) { strcpy(_str, str); } String(const String& str) :_str(NULL) ,_len(str._len) ,_capacity(str._capacity) { String tmp(str._str); swap(_str, tmp._str); } String& operator=(String str) { _len = str._len; _capacity = str._capacity; swap(_str, str._str); return *this; } ~String() { if(_str != NULL) { delete[] _str; _str = NULL; } } public: bool operator==(const String& str) { if(0 == my_strcmp(str._str)) { return true; } else { return false; } } bool operator>(const String& str) { if(my_strcmp(str._str) > 0) { return true; } else { return false; } } bool operator<(const String& str) { if(my_strcmp(str._str) < 0) { return true; } else { return false; } } public: void insert(int pos, char ch) { check_capacity(2);//2包含‘\0‘ int len = _len; if(pos >=0 && pos <= _len) { while(len >= pos) { _str[len + 1] = _str[len]; len--; } _str[pos] = ch; if(pos == _len) { _str[_len + 1] = ‘\0‘; } _len++; } } void insert(int pos, char* str) { assert(str); int insert_len = strlen(str); check_capacity(insert_len + 1);//1是‘\0‘的空间 int len = _len; if(pos >=0 && pos <= _len)//pos = _len 是‘\0‘d的位置 { while(len >= pos) { _str[len + insert_len] = _str[len]; len--; } //strcpy(&_str[pos], str);//error:会加入‘\0‘ int i = 0; for(i = 0; i < insert_len; i++ ) { _str[i + pos] = str[i]; } _str[_len + insert_len] = ‘\0‘; _len += insert_len; } } void insert(int pos, const String& str) { insert(pos, str._str);//类中定义方法 可以访问同类对象的私有成员 } void PushBack(int ch) { check_capacity(sizeof(int) + 1); _str[_len] = (char)ch; _str[_len + 1] = ‘\0‘; _len++; } private: int my_strcmp(const char* str2) { assert(_str); assert(str2); char* str1 = _str; while(*str1 == *str2) { if(‘\0‘ == *str1) { return 0; } str1++; str2++; } return (*str1 > *str2 ? 1 : -1); } private: void check_capacity(int length)//还需要的长度length 包含\0 { if(_capacity - _len < length) { if(_str != NULL) { int new_capacity = length + _len + MORE_CAPACITY; char* new_str = new char[new_capacity]; strcpy(new_str, _str); delete[] _str; _str = new_str; _capacity = new_capacity; } } } private: char* _str; int _capacity;//容量 int _len;//长度 }; void test1()//测试 String的构造 复制 赋值函数 { String str1; String str2("str2"); String str3(str2); str1 = str3; } void test2()//测试 operator== operator< 以及operaator> { String str1("str1"),str2("str2 "),str3(str1); cout<<(str1 > str2)<<endl;//false cout<<(str1 < str2)<<endl;//true cout<<(str1 == str3)<<endl;//true cout<<(str1 == str2)<<endl;//false } void test3()//测试void insert(int pos, char ch) { String str1("abcdef"),str2(str1),str3(str1),str4(str1); str1.insert(0,‘M‘); str2.insert(6,‘M‘); str3.insert(2,‘M‘); str4.insert(-1,‘M‘); str4.insert(10,‘M‘); } void test4()//测试void insert(int pos, char* str) { String str1("abcdef"),str2(str1),str3(str1),str4(str1); str1.insert(0,"ABCDEF"); str2.insert(6,"ABCDEF"); str3.insert(2,"ABCDEF"); str4.insert(-1,"ABCDEF"); str4.insert(10,"ABCDEF"); } void test5() //测试void insert(int pos, const String& str) //测试 void PushBack(int ch) { String str1("abc"),str2("ABC"); str1.insert(0, str2); str2.PushBack(‘D‘); } int main() { test5(); getchar(); return 0; }
本文出自 “爱技术爱生活” 博客,请务必保留此出处http://alick.blog.51cto.com/10786574/1749336
以上是关于C++ 模拟String类 相关的主要内容,如果未能解决你的问题,请参考以下文章
C++初阶:string类string类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现
从零开始学c++———模拟实现string类(常用接口的实现)