您的位置:首页 > 编程语言 > C语言/C++

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: