#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<assert.h>
using namespace std;
class String
{
friend ostream&operator<<(ostream&_cout, const String&s);
friend istream&operator>>(istream&_cin,String&s);
public:
String(char* str = "")
: _str(new char[strlen(str) + 1])
, _size(strlen(str))
, _capacity(strlen(str) + 1)
{
strcpy(_str, str);
}
String(const String& s)
:_str(new char[strlen(s._str) + 1])
, _size(strlen(s._str))
, _capacity(strlen(s._str) + 1)
{
_str = s._str;
_size = s._size;
_capacity = s._capacity;
}
String& operator=(String s)
{
if (*this != s)
{
_size = s._size;
_capacity = s._capacity;
swap(_str, s._str);
}
return *this;
}
void Swap(String& s)
{
if (*this != s)
{
swap(_str, s._str);
swap(_size, s._size);
swap(_capacity, s._capacity);
}
}
~String()
{
if (_str)
{
delete[] _str;
}
}
char* GetStr()
{
return _str;
}
size_t Size()
{
return _size;
}
size_t Capacity()
{
return _capacity;
}
void PushBack(char ch)
{
if (_size >= _capacity-1)
{
Expand(_capacity*2);
}
_str[_size] = ch;
_size+=1;
_str[_size] = '\0';
}
void PushBack(const char* str)
{
size_t len = strlen(str);
if (len + _size > _capacity)
{
Expand(len + _size);
}
strcpy(_str + _size, str);
_size = strlen(_str);
}
void PopFront()
{
if (_size > 0)
{
size_t i = 0;
for (i = 0; i < _size; i++)
{
_str[i] = _str[i + 1];
}
_size--;
}
}
void PopBack()
{
if (_size>0)
{
_str[_size - 1] = _str[_size];
_size--;
}
}
void Insert(size_t pos, char ch)
{
if (_size >= _capacity)
{
Expand(_capacity * 2);
}
size_t end = _size;
while (end >= pos)
{
_str[end+1] = _str[end];
--end;
}
_str[pos] = ch;
++_size;
}
void Insert(size_t pos, const char* str)
{
size_t len = strlen(str);
size_t temp = len;
if (_size + len > _capacity)
{
Expand(_size + len);
}
size_t end = _size;
while (end >= pos)
{
_str[end + len] = _str[end];
--end;
}
while (len-- >0)
{
_str[pos++] = *str++;
}
_size += temp;
}
void Erase(size_t pos, size_t 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
{
for (size_t i = 0; i < _size; ++i)
{
if (_str[i] == ch)
{
return 1;
}
}
return -1;
}
size_t Find(const char* str) const
{
assert(str);
const char* srcStr = _str;
const char* subStr = str;
size_t subLen = strlen(subStr);
size_t srcIndex = 0;
size_t subIndex = 0;
while (srcIndex < _size - subLen - 1)
{
size_t matchIndex = srcIndex;
while (srcStr[matchIndex] == subStr[subIndex])
{
++matchIndex;
++subIndex;
if (subIndex == subLen)
return srcIndex;
}
}
}
char& operator[](size_t pos)
{
assert(pos < _size);
return _str[pos];
}
inline 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;
}
else
{
return false;
}
}
if (i == _size)
{
return true;
}
else
{
return 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);
}
inline bool operator==(const String& s) const
{
size_t i = 0;
for ( i = 0; i<_size&&s._size; ++i)
{
if (_str[i] != s._str[i])
{
return false;
}
}
if (i == _size&&i == s._size)
{
return true;
}
else
{
return false;
}
}
bool operator!=(const String& s)const
{
return !(*this == s);
}
void Expand(size_t n)
{
if (n > _capacity)
{
_str = (char*)realloc(_str, n + 1);
assert(_str);
_capacity = n+1;
cout << "已经扩容" << endl;
}
}
private:
char* _str;
size_t _size;
size_t _capacity;
};
ostream&operator<<(ostream&_cout, const String&s)
{
_cout << s._str<<" 字符个数:"<< s._size<<" 容量空间:"<<s._capacity<<endl;
return _cout;
}
istream&operator>>(istream&_cin, String&s)
{
_cin >> s._str;
return _cin;
}
int main()
{
String s1;
char* s2 = "hello";
s1 = s2;
cout << s1;
String s3;
char*s4 = "worlder";
s3 = s4;
cout << s3;
s1.Swap(s3);
cout << s1;
cout << s3;
system("pause");
return 0;
}