string的应用是非常典型的,下面我写了一些简单的string类的相关的一些操作,包括增删查改等一些功能和一些运算符的重载,包括他们的测试用例:


#include<iostream>
#include<string>
#include<assert.h>
using namespace std;

#define CARA 3;
class String
{
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(NULL)
 {
  String tmp(s._str);
  swap(_str,tmp._str);
 }

 char& operator[](int size)
 {
  return _str[size];
 }

 String& operator=(const String& s)
 {
  if (this != &s)
  {
   String tmp(s._str);
   swap(_str, tmp._str);
  }
  return *this;
 }

 void _CheckCapacity(size_t capacity)
 {
  if (capacity > _capacity)
  {
   _capacity = capacity + CARA;
   _str = (char*)realloc(_str, _capacity);
   assert(_str);
  }
 }


 void PushBack(char ch)
 {
  _CheckCapacity(_size+2);
  _str[_size++] = ch;
  _str[_size] = '\0';
  
  //或者:
  /*Insert(_size+1,ch);
  _size++;*/

 }

 void PopBack()
 {
  --_size;
  _str[_size] = '\0';
 }

 void PushFront(char ch)
 {
  _CheckCapacity(_size + 2);

  for (int begin = _size; begin >= 0; begin--)
  {
   _str[begin + 1] = _str[begin];
  }
  _str[0] = ch;
  _size++;
 }

 void PopFront()
 {
  for (int begin = 1; begin <= _size; begin++)
  {
   _str[begin - 1] = _str[begin];
  }
  _size--;
 }

 
 void Insert(size_t pos, char ch)
 {
  _CheckCapacity(_size + 2);

  for (int begin = _size; begin >= pos-1; begin--)
  {
   _str[begin + 1] = _str[begin];
  }
  _str[pos-1] = ch;
  _size++;
 }

 void Insert(size_t pos, char* str)
 {
  _CheckCapacity(_size + strlen(str)+1);

  //char *strncpy(char *strDest, const char *strSource, size_t count);  strncpy的用法
  int end = strlen(str) + _size;
  for (int begin = _size; begin >= pos; begin--)
  {
   _str[end] = _str[begin];
   end--;
  }
  strncpy(_str+pos, str, strlen(str));
  _size += strlen(str);
 }

 int Find(const String& s)
 {
  if (_size < s._size)
  {
   return -1;
  }
  int srcIndex = 0;
  int desIndex = 0;
  int tmp = 0;
  while (srcIndex<_size)
  {
   tmp = srcIndex;
   while (desIndex < s._size)
   {
    if (_str[srcIndex] == s._str[desIndex])
    {
     srcIndex++;
     desIndex++;
    }
    else
    {
     desIndex = 0;
     srcIndex = tmp + 1;
     break;
    }
   }

   if (desIndex == s._size)
   {
    return tmp;
   }
  }
  return -1;
 }

 bool operator<(const String& s)
 {
  char*begin1 = _str;
  char*begin2 = s._str;
  while (*begin1 && *begin2)
  {
   if (*begin1 < *begin2)
   {
    return true;
   }
   else if (*begin1 > *begin2)
   {
    return false;
   }
   else
   {
    begin1++;
    begin2++;
   }
  }
  return *begin1 < *begin2;
 }

 bool operator==(const String& s)
 {
  char*begin1 = _str;
  char*begin2 = s._str;
  if (_size != s._size)
  {
   return false;
  }

  while (*begin1 && *begin2)
  {
   if (*begin1 != *begin2)
   {
    return false;
   }
   else
   {
    begin1++;
    begin2++;
   }
  }
  return true;
 }

 bool operator>(  const String& s)
 {
  return !((*this < s) ||( *this == s));
 }

 char* Disply()
 {
  return _str;
 }

 ~String()
 {
  if (_str)
  {
   delete[]_str;
  }
 }

private:
 char *_str;
 int _size;
 int _capacity;
};

void Test1()
{
 String s1("abcde");
 String s2(s1);
 cout << s2.Disply() << endl;

 String s3;
 s3 = s1;
 cout << s3.Disply() << endl;
}

void Test2()    //测试PushBack
{
 String s1("abcde");
 s1.PushBack('z');
 cout << s1.Disply() << endl;
}

void Test3()    //测试Insert一个字符
{
 String s1("abcde");
 s1.Insert(4,'z');
 cout << s1.Disply() << endl;
}

void Test4()    //测试Insert一个字符串
{
 String s1("abcde");
 s1.Insert(5, "fgh");
 cout << s1.Disply() << endl;
}

void Test5()    //测试PopBack
{
 String s1("abcde");
 cout << s1.Disply() << endl;

 s1.PopBack();
 cout << s1.Disply() << endl;
}

void Test6()   //测试<
{
 String s1("ab");
 String s2("abc");
 cout << (s1 < s2) << endl;
}

void Test7()   //测试==
{
 String s1("ab");
 String s2("abc");
 cout << (s1 == s2) << endl;
}

void Test8()  //测试>
{
 String s1("a");
 String s2("abc");
 cout << (s1 > s2) << endl;
}

void Test9()
{
 String s1("abcdabcef");
 int ret = s1.Find("efg");
 cout << ret << endl;
}

void Test10()
{
 String s1("abcd");
 s1.PushFront('a');
 cout << s1.Disply() << endl;
}

void Test11()
{
 String s1("abcd");
 s1.PopFront();
 cout << s1.Disply() << endl;
}


int main()
{
 //Test1();
 Test2(); //测试PushBack
 //Test3();//测试Inser
 //Test4();  //测试Insert一个字符串
 //Test5();//测试PopBack
 //Test6();  //测试<
 //Test7();  //测试==
 //Test8();    //测试>
 //Test9();  //测试 Find
 //Test10();  //测试PushFront
 //Test11();  //测试PopFront
 return 0;
}