C++自定义String字符串类,支持子串搜索
C++自定义String字符串类
实现了各种基本操作,包括重载+号实现String的拼接
findSubStr函数,也就是寻找目标串在String中的位置,用到了KMP字符串搜索算法。
#include <iostream>
#include <cstring>
using namespace std;
class String;
class Data{ // 抽象基类Data
public:
virtual const int compareTo(const String& target) const = 0; // virtual比较函数
};
class String: public Data{ // String类。继承自Data
public:
static int num_strings; // 程序周期内创建的String对象个数
static const int CINLIM = 80; // 限制字符长度
String(); // 默认构造函数
String(unsigned int capacity); // 以大小为capacity来初始化
String(unsigned int capacity, char ch); // 填充字符为ch,大小为capacity
String(const char* target); // 以一个c风格字符串初始化
String(const String& st); // 拷贝构造函数
~String(){ delete ptr; } // 析构函数
const int findSubStr(const char* substr) const; // 找出子串位置
const int findChar(char target) const; // 找出字符第一次出现位置
const int length() const; // 返回字符串大小
static int howManyExit(); // 返回程序周期内创建的String对象个数
const int compareTo(const String& target) const override; // 与其它String对象比较大小
String& operator=(const String&); // 重载赋值操作符
String& operator=(const char*); // 重载赋值操作符
friend String operator+(const String&,const String&) ; // 重载加号
char& operator[](int i); // 重载[]
const char& operator[](int i) const; // 重载[]
friend bool operator>(const String& st1,const String& st2); // 重载>
friend bool operator<(const String& st1,const String& st2); // 重载<
friend bool operator==(const String& st1,const String& st2); // 重载==
friend ostream& operator<<(ostream& os,const String& st); // 重载<<
friend istream& operator>>(istream& is,String& st); // 重载>>
private:
char* ptr; // 内置char数组指针
unsigned int len; // 当前String长度
};
int String::num_strings = 0; // 静态变量初始化
String::String() { ptr = new char[10]; len = 10; }
String::String(unsigned int capacity){
ptr = new char[capacity]; len = capacity;
++ num_strings;
}
String::String(unsigned int capacity, char ch){
ptr = new char[capacity]; len = capacity;
for(int i=0;i<len;i++)
ptr[i] = ch;
++ num_strings;
}
String::String(const char* target){
int tmp = (int)strlen(target);
len = (unsigned)tmp;
ptr = new char[len];
strcpy(ptr,target);
++ num_strings;
}
String::String(const String& st){
int tmp = (int)strlen(st.ptr);
len = (unsigned)tmp;
ptr = new char[len];
strcpy(ptr,st.ptr);
++ num_strings;
}
const int String::findSubStr(const char* substr) const{
int next[100];
next[0] = -1;
int i=0,j=-1;
int lenP = (int)strlen(substr);
while(i<lenP){
if(j==-1||substr[i]==substr[j]){
++i; ++j;
next[i] = j;
}else
j = next[j];
}
i = 0,j = 0;
while(i<len&&j<lenP){
if(j==-1|ptr[i]==substr[j]){
++i; ++j;
}else
j = next[j];
}
if(j==lenP) return len - j;
return -1;
}
const int String::findChar(char target) const{
for(int i=0;i<len;i++)
if(ptr[i] == target) return i;
return -1;
}
const int String::length() const{
return this->len;
}
int String::howManyExit(){
return num_strings;
}
const int String::compareTo(const String& target) const{
if(target.ptr == nullptr || strcmp(ptr,target.ptr)>0)
return 1;
else if(strcmp(ptr,target.ptr)==0)
return 0;
else
return -1;
}
String& String::operator=(const String& str){
if(this == &str)
return *this;
delete ptr;
len = (int)strlen(str.ptr);
ptr = new char[len];
strcpy(ptr,str.ptr);
return *this;
}
String& String::operator=(const char* str){
delete[] ptr;
len = (int)strlen(str);
ptr = new char[len+1];
strcpy(ptr,str);
return *this;
}
String operator+(const String& st1,const String& st2){
int lenSt2 = (int)strlen(st2.ptr);
int lenSt1 = (int)strlen(st1.ptr);
char* temp = new char[lenSt1+lenSt2+1];
strcpy(temp,st1.ptr);
for(int i=lenSt1;i<lenSt1+lenSt2;i++)
temp[i] = st2.ptr[i-lenSt1];
return String(temp);
}
char& String::operator[](int i){
return ptr[i];
}
const char& String::operator[](int i) const{
return ptr[i];
}
bool operator<(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)<0);
}
bool operator>(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)>0);
}
bool operator==(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)==0);
}
ostream& operator<<(ostream& os,const String& st){
os<<st.ptr;
return os;
}
istream& operator>>(istream& is,String& st){
char temp[String::CINLIM];
is.get(temp,String::CINLIM);
if(is)
st = temp; //在此处" = "已被重载过了
while(is && is.get()!='\n')
continue;
return is;
}
int main()
{
String A = "abcd";
String B = "efgh";
String C = A + B;
cout << C << endl;
}
C++自定义String字符串类,支持子串搜索的更多相关文章
- 17.C++-string字符串类(详解)
C++字符串string类 在C语言里,字符串是用字符数组来表示的,而对于应用层而言,会经常用到字符串,而继续使用字符数组,就使得效率非常低. 所以在C++标准库里,通过类string从新自定义了字符 ...
- 字符串类——KMP子串查找算法
1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...
- Java String 字符串类细节探秘
一. 字符串基本知识要点 字符串类型String是Java中最常用的引用类型.我们在使用Java字符串的时候,通常会采用两种初始化的方式:1. String str = "Hello Wor ...
- String字符串类总结
object类 int hashCode() Object定义的hashCode方法能为不同对象返回不同的整数.实际上是把JVM给对象分配的地址转化为整数,确保了逻辑上的唯一性.而转化的散列算法,可能 ...
- Android 自定义EditText实现类iOS风格搜索框
最近在项目中有使用到搜索框的地方,由于其样式要求与iOS的UISearchBar的风格一致.默认情况下,搜索图标和文字是居中的,在获取焦点的时候,图标和文字左移.但是在Android是并没有这样的控件 ...
- 漫话C++之string字符串类的使用(有汇编分析)
C++中并不提倡继续使用C风格的字符串,而是为字符串定义了专门的类,名为string. 使用前的准备工作 在使用string类型时,需要包含string头文件,且string位于std命名空间内: # ...
- String字符串类的获取功能
StringDemo.java /* * String类的获取功能: * int length():获取字符串的长度,其实也就是字符个数 * char charAt(int index):获取指定索引 ...
- String字符串类课后作业
String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...
- C++常用的string字符串截断函数
C++中经常会用到标准库函数库(STL)的string字符串类,跟其他语言的字符串类相比有所缺陷.这里就分享下我经常用到的两个字符串截断函数: #include <iostream> #i ...
随机推荐
- ios兼容 iphoneX ios10 ios11
假设你有一个固定位置的标题栏,你的iOS10的CSS可能是这样写的: header { position: fixed; top:; left:; right:; height: 44px; padd ...
- linux下 启动node 和关闭node
1.用forever 进行管理 npm install -g forever forever start app.js //启动 forever stop app.js //关闭 2.用自带的服务n ...
- Redis入门之增删改查等常用命令总结
Redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快. Redis使用了单线程架构,预防了多线程可能产生的竞争问题. 作者对于Redis源代 ...
- appium框架之bootstrap
(闲来无事,做做测试..)最近弄了弄appium,感觉挺有意思,就深入研究了下. 看小弟这篇文章之前,先了解一下appium的架构,对你理解有好处,推荐下面这篇文章:testerhome appium ...
- 软工+C(3): 超链接
// 上一篇:分数和checklist // 下一篇:Alpha/Beta换人 注:平常看文章,总有能和构建之法,软件工程相关的链接,增量记录,也可以通过在其他人博客的交流中使用相关的超链接,在使用中 ...
- 控制结构(8): 线性化(linearization)
// 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...
- IRepository<Developer> repository 出现 Abp.Domain.Repositories.IRepository which was not registered.
“/”应用程序中的服务器错误. Can't create component 'SWJ.SSO.DomainServices.TestService' as it has dependencies t ...
- pc端前端和手機端區別
1.pc端寬度比較固定,手機端可以橫屏或者豎屏: 2.pc端不需要處理手機觸摸,而手機端需要: 3.pc端不需要處理鍵盤事件: 3.pc的瀏覽器內核很多,手機端基本上是webkit或者是基於webki ...
- 一、Win10搭建IIS
一.控制面板-启动或关闭Windows功能 二.找到Internet Information Services项-全勾选 点击确定 三.在浏览器地址栏输入:localhost之后显示下面页面,证明安装 ...
- python之动态参数 *args,**kwargs和命名空间
一.函数的动态参数 *args,**kwargs, 形参的顺序1.你的函数,为了拓展,对于传入的实参数量应该是不固定,所以就需要用到万能参数,动态参数,*args, **kwargs 1,*args ...