自定义string类
#include <iostream>
#include <cstring>
using namespace std; class String; class Data{ // 抽象基类Data
public:
virtual const int compareTo(const String& target) const = ; // virtual比较函数
}; class String: public Data{ // String类。继承自Data
public:
static int num_strings; // 程序周期内创建的String对象个数
static const int CINLIM = ; // 限制字符长度
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; ptr = nullptr;} // 析构函数
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 = ; // 静态变量初始化 String::String() { ptr = new char[]; len = ; } 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=;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[];
next[] = -;
int i=,j=-;
int lenP = (int)strlen(substr);
while(i<lenP){
if(j==-||substr[i]==substr[j]){
++i; ++j;
next[i] = j;
}else
j = next[j];
}
i = ,j = ;
while(i<len&&j<lenP){
if(j==-|ptr[i]==substr[j]){
++i; ++j;
}else
j = next[j];
}
if(j==lenP) return len - j;
return -;
} const int String::findChar(char target) const{
for(int i=;i<len;i++)
if(ptr[i] == target) return i;
return -;
} 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)>)
return ;
else if(strcmp(ptr,target.ptr)==)
return ;
else
return -;
} 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+];
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+];
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)<);
}
bool operator>(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)>);
}
bool operator==(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)==);
}
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;
}
转自:https://www.cnblogs.com/1Kasshole/archive/2018/07/28/9382828.html
自定义string类的更多相关文章
- C++基础 (5) 第五天 重载new delete () 只能操作符 自定义string类
1 昨日回顾 1.static 对整个类共享 可以直接用 类::方法 调用 如果是私有的 可以提供一个静态的访问静态成员的方法 2 自定义的数组类-重载操作符[] 3 重载new和delete 4 重 ...
- 自定义String类,并且实现在STL容器中添加自定义的类型
13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...
- 使用引用计数和copy-on_write实现String类
本文写于2017-01-18,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6295420.html 这算是我开始复习的内容吧,关于st ...
- C++自定义String字符串类,支持子串搜索
C++自定义String字符串类 实现了各种基本操作,包括重载+号实现String的拼接 findSubStr函数,也就是寻找目标串在String中的位置,用到了KMP字符串搜索算法. #includ ...
- java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)
代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- 关于MapReduce中自定义分区类(四)
MapTask类 在MapTask类中找到run函数 if(useNewApi){ runNewMapper(job, splitMetaInfo, umbilical, reporter ...
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...
- java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类
枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...
随机推荐
- 哇!吐槽!oh shit
一个jsp写了5000行,我尼玛醉了,看晕了-2017年10月12日10:19:40
- 人们为什么在Python脚本的第一行上编写#!/ usr / bin / env python shebang?
在我看来,如果没有该行,文件运行相同. #1楼 您可以使用virtualenv尝试此问题 这是test.py #! /usr/bin/env python import sys print(sys.v ...
- [ZJOI2009] 硬币游戏(找规律)
题目 洛谷传送门 题解 把1/21/21/2转化成0/10/10/1,所以直接可以异或. 对于长度为nnn的0/10/10/1数列,发现每变换2k(k>1)2^k(k>1)2k(k> ...
- 安装pip的三种方式
pip是python的一个工具,用来安装python包特别方便.Linux系统是是内置python程序,因为许多Linux内置文件都是使用python来编写的,比如说yum. 1.脚本安装 通过脚本的 ...
- MongoDB 分片管理(四)数据均衡 -- 特大快
1.1 特大快形成 如果用date字段作为片键,集合中date是一个日期字符串,如:year/month/day,也就是说,mongoDB一天创建一个块.因块内所有文档的片键一样,因此这些块是不可拆分 ...
- 四十五.加密与解密 AIDE入侵检测系统 扫描与抓包
一.加密与解密 1.1 常见的加密算法 对称加密:怎么加密,就怎么解密 DES Date Encryption Standard AES Advance Encryption Standard 非对称 ...
- jQuery多选和单选下拉框插件select.js
一.插件描述 可通过参数设置多选或者单选,多选返回数组结果,单选返回字符串,如图: 下载地址:https://pan.baidu.com/s/1JjVoK89_ueVVpfSlMDJwUQ 提取码 ...
- NodeJS基础知识
console.log方法: console.log("This is a test string"); node app.js 使用重定向标准输出流: node app.js 1 ...
- 请写出一段python代码实现删除list里面的重复元素?
l1 = ['b','c','d','c','a','a'] l2 = list(set(l1)) print(l2)
- journalnode Can't scan a pre-transactional edit log 异常处理
由于数据磁盘爆满,达到100%,导致journalnode宕掉,在启动journalnode以后,查看日志,提示Can't scan a pre-transactional edit log,这个时候 ...