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;
}
相关推荐
迷途之人不知返43 分钟前
算法系列2:滑动窗口
算法
IT爱学堂43 分钟前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
有点。44 分钟前
C++认识数
开发语言·c++
Herbert_hwt1 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
2023自学中1 小时前
Qt 简易聊天室(第二篇),单线程 改为 多线程,方便后续增加文件传输功能
c++·qt
W_326002 小时前
Python文件进阶:一维数据与 CSV 文件读写
开发语言·python
Tyler_TXZ2 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
Tisfy2 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-2 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。3 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论