c++string类的相关操作
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类的相关操作相关推荐
- Java String类的相关操作
Java String类的相关操作 一.如何遍历字符串 //法一 String str="hello world"; for(int i=0;i<str.length();i ...
- 【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)
目录 1. string容器 简介 2. string类常用的操作函数 3. 构造函数 4. 赋值操作 5. 字符串拼接 6. 字符串查找和替换 7. 字符串比较 8. 字符串存取 9. 字符串插入和 ...
- string类的相关知识及部分操作
文章目录 string对象的初始化 string::size_type类型 string对象的读写操作 使用标准库中的iostream 使用getline读取一整行 string对象的比较操作 str ...
- java当中日期类的相关操作(学习笔记)
一:引言 Calendar类是日历类,提供操作日历字段的方法,其中有常用操作 get 和 set 方法还有 add方法 详细用法请看码 二:上码 package cn.wyj.one;import j ...
- 【JAVA中String类的相关知识】
文章目录 一.创建字符串 1.1创建字符串时的内存布局 二.字符串比较相等 2.1equals方法 三.字符串常量池 3.1实例化操作的内存布局 3.2intern手动入池 四.理解字符串不可变 4. ...
- C++ 自定义string类 重载相关运算符
c++提供的string类 c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的. 今天我们自己来简单来实现MyString类来模拟 string类能做得一 ...
- Java 中 String 类的常规操作
String类型详解 String本身就是一个类,只是Java对其进行了特殊处理. 两种实例化方式原理及区别: /* 两种创建 String 对象的方法 * 1. 直接赋值:(推荐按这种方法) * 2 ...
- C++设计:关于CMatrix类的相关操作
1.头文件声明 #ifndef CMATRIX_H #define CMATRIX_H #include <iostream> using namespace std; class CMa ...
- string类具体用法
string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...
最新文章
- MXNet学习:试用卷积-训练CIFAR-10数据集
- 在虚拟机上安装Docker并运行Nginx
- 合成复用原则java实例_第7节 合成复用原则
- GDCM:gdcm::DefinedTerms的测试程序
- could not create the java virtual machine启动eclipse报错
- python中pop用法_Python dict pop()用法及代码示例
- linux csh错误,运行lampp时报错,错误信息如下,求解决方案
- 数字转换星期几python_Python基本时间转换
- 如何打造高可伸缩的移动电商架构?
- EditDistance,求两个字符串最小编辑距离,动态规划
- linux系统卸载git,linux卸载gitlab
- office2013安装与卸载
- android 系统 迷你pc,Remix mini:一款真正运行安卓系统的电脑
- 《OpenDRIVE1.6规格文档》3
- PPT基础(二十二)裁剪图片
- python算法口诀_python 正则表达式口诀
- python的意思是什么_python-x%2 == 0是什么意思?
- 计算机专业有必要报计算机二级吗?该如何做好未来的规划?迷茫的同学,看这里!
- 全球低轨卫星物联网的发展现状
- SAP:返回消息文本信号灯