2024.9.2

还没写完

cpp 复制代码
#include <iostream>
#include <cstring>
using namespace std;

class myString
{
private:
    char *str;          //字符串
    int size;           //实际字符长度
    int len;            //字符串容量
public:
    myString():size(10)     //无参构造函数
    {
        len = size + 1;
        str = new char[size];
    }
    myString(const char*s):size(strlen(s))      //有参构造函数
    {
        //cout<<size<<endl;
        len = size + 1;
        str = new char[size+1];
        strcpy(str,s);
    }
    ~myString()         //析构函数
    {
        delete []str;
    }
    myString &operator=(const myString &R);     //=重载
    char &at(const int &index);                 //at
    char &operator[](const int &index);         //下标重载
    char *data();       //data
    char *c_str();      //c_str
    bool empty();       //判空
    int sszie();        //字符实际长度
    int capcity();      //字符串容量
    void clear();       //清空
    void push_back(const char &s);   //尾插1个字符
    void pop_back();    //尾删1个字符
    void expand();      //二倍扩容
    myString &operator+=(const myString &R); //+=重载
    myString &operator+(const myString &R);
    myString &operator+(const char &R);
    void show();        //展示
};
//=
myString & myString:: operator=(const myString &R)
{
    /*delete [] str;
    size = R.size;
    len = R.len;
    char *newstr = new char[len];
    strcpy(newstr,R.str);
    str = newstr;*/
    size = R.size;
    len = R.len;
    char *newstr = new char[len];
    strcpy(newstr,R.str);
    delete [] str;
    str = newstr;
    return *this;
}
//at
char &myString :: at(const int &index)
{
    if(index > size || index < 0)       //判断是否下标越界
    {
        cout<<"下标越界"<<endl;
        exit(0);
    }
    return str[index];
}

//[]
char &myString::operator[](const int &index)
{
    return str[index];
}
//data
char *myString ::data()
{
    return &str[0];
}
//c_str
char *myString :: c_str()
{
    return str;
}
//empty
bool myString::empty()
{
    return size==0;
}
//ssize
int myString::sszie()
{
    return size;
}
//capcity
int myString::capcity()
{
    return len;
}
//clear
void myString::clear()
{
//    delete [] str;
//    str = new char[size+1];
    memset(str,0,size+1);
}
//show
void myString ::show()
{
//    cout<<size<<endl;
//    cout<<strlen(str)<<endl;
    cout<<str<<endl;
}
//尾插
void myString::push_back(const char &s)
{
    if((size + 1) >= len)       //判断是否需要二倍扩容
    {
        expand();
    }
    str[size] = s;
    size++;
    str[size] = '\0';
}
//尾删一个字符
void myString::pop_back()
{
    str[size-1] = 0;
    size--;
}
//+=
myString & myString::operator+=(const myString &R)
{
    while(size + int(strlen(R.str)) >= len)
    {
        expand();
    }
    strcat(this->str,R.str);
    return *this;
}
//二倍扩容
void myString::expand()
{
    len = len * 2 - 1;
    char*newstr = new char[len];
    memset(newstr,0,len);
    strcpy(newstr,str);
    delete []str;
    str = newstr;
}
//+
myString &myString::operator+(const myString &R)        //两个字符串相加
{
    while((size + R.size) >= len)
    {
        expand();
    }
    strcat(str,R.str);
    size = size + R.size;
    return *this;
}
myString &myString::operator+(const char &R)        //字符串和单个字符相加
{
    if(size + 1 >= len)
    {
        expand();
    }
    push_back(R);
    return *this;
}
int main()
{
    myString s1("nihao");
    myString s2("hello world");
    s1 = s2;
    s1.show();
    cout<<s1.at(1)<<endl;
    s1[0] = 'H';
    s1.show();
    s1.push_back('!');
    s1.show();
    s1.pop_back();
    s1.show();
    myString s3;
    s3 = s1 + s2 + s2;
    s3.show();
    cout<<"**************"<<endl;
    s3 = s3 + '?' + '!';
    s3.show();
    s1.clear();
    s1.show();
    s1.at(-1);
    return 0;
}
相关推荐
Swift社区2 分钟前
Swift 图论实战:DFS 算法解锁 LeetCode 323 连通分量个数
算法·swift·图论
tomcsdn313 分钟前
SMTPman,smtp的端口号是多少全面解析配置
服务器·开发语言·php·smtp·邮件营销·域名邮箱·邮件服务器
<但凡.5 分钟前
数据结构与算法之美:广义表
数据结构·c++·算法
EnigmaCoder8 分钟前
Java多线程:核心技术与实战指南
java·开发语言
前端极客探险家16 分钟前
告别卡顿与慢响应!现代 Web 应用性能优化:从前端渲染到后端算法的全面提速指南
前端·算法·性能优化
程序员Xu1 小时前
【OD机试题解法笔记】连续出牌数量
笔记·算法·深度优先
CoovallyAIHub1 小时前
单目深度估计重大突破:无需标签,精度超越 SOTA!西湖大学团队提出多教师蒸馏新方案
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目
深度学习·算法·计算机视觉
偷偷的卷2 小时前
【算法笔记 day three】滑动窗口(其他类型)
数据结构·笔记·python·学习·算法·leetcode
北京地铁1号线2 小时前
Zero-Shot(零样本学习),One-Shot(单样本学习),Few-Shot(少样本学习)概述
人工智能·算法·大模型