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 ...
随机推荐
- 超哥笔记--shell 基本命令(4)
一 linux 命令行的组成结构 自定义命令行结构 PS1变量来控制 \u \W 最后一位工作目录 \w 绝对路径工作目录 \t 显示24h制的时间 \h PS1="[\u@\h \w \t ...
- R语言学习——因子
变量可分为名义型变量.有序型变量或者连续型变量.名义型变量是没有顺序之分的类别变量,如糖尿病类型Diabetes(Type1.Type2),即使在数据中Type1编码为1而Type2编码为2,这也并不 ...
- mac 开发新户攻略-brew
原文 https://www.cnblogs.com/kccdzz/p/7676840.html 这里为了备份一下,方便我自己寻找. 1.介绍 brew是一个软件包管理工具,类似于centos下的yu ...
- 小程序第三方框架对比 ( wepy / mpvue / taro )(转)
文章转自 https://www.cnblogs.com/Smiled/p/9806781.html 众所周知如今市面上端的形态多种多样,手机Web.ReactNative.微信小程序, 支付宝小程 ...
- Mac系统下Mysql存储数据报错 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value
比如如下mysql操作插入数据: const mysql = require('mysql'); /* createConnection方法创建一个表示与Mysql数据库服务器之间连接的 Connec ...
- 怎么在Vue的某个组件中根据组件tag标签名获取到对应的VueComponent实例呢
1.以前玩omi框架的时候,有Omi.get方法来获取实例, ...好久没玩了,忘了.反正很喜欢该方法.2.如今想在vue里面怎么能够快速获取到对应组件标签名的的实例呢?3.文档也看过,似乎脑海中没啥 ...
- 如何用ABP框架快速完成项目(6) - 用ABP一个人快速完成项目(2) - 使用多个成熟控件框架
正如我在<office365的开发者训练营,免费,在微软广州举办>课程里面所讲的, 站在巨人的肩膀上的其中一项就是, 尽量使用别人成熟的框架. 其中也包括了控件框架 abp和52abp ...
- 03-JavaScript之数据类型
JavaScript之数据类型 1.介绍 JavaScript数据类型分为两类:原始类型(primitive type)和对象类型(object type) 2.原始类型 数字 - number.字符 ...
- appium框架之bootstrap
(闲来无事,做做测试..)最近弄了弄appium,感觉挺有意思,就深入研究了下. 看小弟这篇文章之前,先了解一下appium的架构,对你理解有好处,推荐下面这篇文章:testerhome appium ...
- C#直接使用DllImport调用C/C++动态库(dll文件)
1.C/C++动态库的编写 下面是我编写的一个比较简单的C++dll文件用来测试,关于如何编写dll文件,我这里便不再赘述,不懂得自行查询, (1).h文件 #ifdef MYDLL_EXPORTS ...