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;
}

转载于:https://blog.51cto.com/10706198/1763142

c++string类的相关操作相关推荐

  1. Java String类的相关操作

    Java String类的相关操作 一.如何遍历字符串 //法一 String str="hello world"; for(int i=0;i<str.length();i ...

  2. 【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)

    目录 1. string容器 简介 2. string类常用的操作函数 3. 构造函数 4. 赋值操作 5. 字符串拼接 6. 字符串查找和替换 7. 字符串比较 8. 字符串存取 9. 字符串插入和 ...

  3. string类的相关知识及部分操作

    文章目录 string对象的初始化 string::size_type类型 string对象的读写操作 使用标准库中的iostream 使用getline读取一整行 string对象的比较操作 str ...

  4. java当中日期类的相关操作(学习笔记)

    一:引言 Calendar类是日历类,提供操作日历字段的方法,其中有常用操作 get 和 set 方法还有 add方法 详细用法请看码 二:上码 package cn.wyj.one;import j ...

  5. 【JAVA中String类的相关知识】

    文章目录 一.创建字符串 1.1创建字符串时的内存布局 二.字符串比较相等 2.1equals方法 三.字符串常量池 3.1实例化操作的内存布局 3.2intern手动入池 四.理解字符串不可变 4. ...

  6. C++ 自定义string类 重载相关运算符

    c++提供的string类 c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的. 今天我们自己来简单来实现MyString类来模拟 string类能做得一 ...

  7. Java 中 String 类的常规操作

    String类型详解 String本身就是一个类,只是Java对其进行了特殊处理. 两种实例化方式原理及区别: /* 两种创建 String 对象的方法 * 1. 直接赋值:(推荐按这种方法) * 2 ...

  8. C++设计:关于CMatrix类的相关操作

    1.头文件声明 #ifndef CMATRIX_H #define CMATRIX_H #include <iostream> using namespace std; class CMa ...

  9. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

最新文章

  1. MXNet学习:试用卷积-训练CIFAR-10数据集
  2. 在虚拟机上安装Docker并运行Nginx
  3. 合成复用原则java实例_第7节 合成复用原则
  4. GDCM:gdcm::DefinedTerms的测试程序
  5. could not create the java virtual machine启动eclipse报错
  6. python中pop用法_Python dict pop()用法及代码示例
  7. linux csh错误,运行lampp时报错,错误信息如下,求解决方案
  8. 数字转换星期几python_Python基本时间转换
  9. 如何打造高可伸缩的移动电商架构?
  10. EditDistance,求两个字符串最小编辑距离,动态规划
  11. linux系统卸载git,linux卸载gitlab
  12. office2013安装与卸载
  13. android 系统 迷你pc,Remix mini:一款真正运行安卓系统的电脑
  14. 《OpenDRIVE1.6规格文档》3
  15. PPT基础(二十二)裁剪图片
  16. python算法口诀_python 正则表达式口诀
  17. python的意思是什么_python-x%2 == 0是什么意思?
  18. 计算机专业有必要报计算机二级吗?该如何做好未来的规划?迷茫的同学,看这里!
  19. 全球低轨卫星物联网的发展现状
  20. SAP:返回消息文本信号灯

热门文章

  1. C++访问WebService
  2. C++教程:C++开发语言可以做些什么?
  3. MyBatis的三个基本要素
  4. 无问西东,哪怕重头来过
  5. Django实战(6):对比RoR和Django的模板系统
  6. Linux运维学习笔记
  7. jquery SELECT 操作
  8. kdchxue讲解V9父栏目调用子栏目的办法
  9. 程序员面试金典——18.4 2的个数
  10. ILS-LDA基于迭代最小二乘的字典学习算法的学习