• 字符串类设计与应用


    题目描述

    模拟标准库字符串类实现你自己的字符串类。该类需具有构造、字符串连接+、取子串和复制构造、移动构造、复制赋值、移动赋值、输出等功能。要求使用动态分配存储字符串内容。

    输入描述

    测试程序有4个字符串,每个样例前两行含长度不超过200的俩字符串,赋值给前2个字符串对象,后面若干指令,每个指令占一行,分别由指令码和所需参数组成,空格分隔,每个指令码具有不同参数和意义; 指令有下述几种 : 指令P i代表输出字符串i; 指令A i j代表字符串i赋值给字符串j; 指令C i j k 代表将字符串i和字符串j连接后赋值给字符串k; 指令F i s l k代表从字符串i位置s开始的长度为l的子串赋值给字符串k;所有操作指令和参数肯定是有校的。

    输出描述

    每个字符串输出占1行

    样例输入

    Hello
    HDU
    P 1
    P 2
    C 1 2 3
    P 3
    F 3 5 3 4
    P 4

    样例输出

    Hello
    HDU
    HelloHDU
    HDU
    网址:http://virlab.hdu.edu.cn/assignment/programList.jsp?proNum=1&courseID=4&assignID=55

    题解:
    简单的语法练习题。
    可以自行扩展一下,比如说实现stl中string的所有操作,加深理解,由于时间原因只多加了个resize()。
    注意样例中只有3个操作,而题目要求了4个。

    以下是代码:
    #include<bits/stdc++.h>
    #define INF 0x3f3f3f3f
    #define me(a,b) memset(a,b,sizeof(a))
    #define N 101
    typedef long long ll;
    using namespace std;
    
    class mystring
    {
    private:
          char*s;
          int l;
          int size;
    public:
          //构造
          mystring()//普通构造
          {
                s=NULL;
                l=0;
                size=0;
          }
          mystring(char *a);
          mystring(mystring&a);
          mystring(mystring&&a);
          ~mystring()
          {
                delete[] s;
          }
    
          //运算符重载
          mystring&operator=(char*a);
          mystring&operator=(mystring&a);
          mystring&operator=(mystring&&a);
          friend mystring operator+(mystring&a,mystring&b);
    
          //功能
          void show();
          friend mystring sub(mystring&a,int s,int l);
          void resize(int n);//重新分配内存(当已申请的内存不够用时,参考stl的string)
    
    /*
    
    */
    }s[4];
    
    //构造
    mystring::mystring(char*a)
    {
          this->s=NULL;
          (*this)=a;//使用重载的=号构造
    }
    mystring::mystring(mystring&a)
    {
          this->s=NULL;
          (*this)=a;//使用重载的=号构造
    }
    mystring::mystring(mystring&&a)
    {
          l=a.l;
          size=a.size;
          delete[]s;//防止内存泄漏
          s=a.s;
          a.s=NULL;
    }
    
    
    //重载
    mystring& mystring::operator=(char*a)
    {
          l=strlen(a);
          size=l+10;
          delete[]s;//防止内存泄漏
          s=new char[size];
          for(int i=0;i<l;i++)
                s[i]=a[i];
          return(*this);
    }
    mystring& mystring::operator=(mystring&a)
    {
          l=a.l;
          size=a.size;
          delete[]s;//防止内存泄漏
          s=new char[size];
          for(int i=0;i<l;i++)
                s[i]=a.s[i];
          return(*this);
    }
    mystring& mystring::operator=(mystring&&a)
    {
          l=a.l;
          size=a.size;
          delete[]s;//防止内存泄漏
          s=a.s;
          a.s=NULL;
          return(*this);
    }
    mystring operator+(mystring&a,mystring&b)
    {
          mystring tmp;
          tmp.l=a.l+b.l;
          tmp.size=tmp.l+10;
          tmp.s=new char[tmp.size];
          for(int i=0;i<a.l;i++)
          {
                tmp.s[i]=a.s[i];
          }
          for(int i=a.l;i<tmp.l;i++)
          {
                tmp.s[i]=b.s[i-a.l];
          }
          return tmp;
    }
    
    //操作
    void mystring::show()
    {
          for(int i=0;i<l;i++)
          {
                cout<<s[i];
          }
          cout<<endl;
    }
    void mystring::resize(int n)
    {
          this->size=n;
          char *tmp=new char[n];
          for(int i=0;i<this->l;i++)
                tmp[i]=this->s[i];
          delete[]s;
          s=tmp;
          tmp=NULL;
    }
    mystring sub(mystring&a,int s,int l)
    {
          mystring tmp;
          tmp.l=l;
          tmp.size=tmp.l+10;
          tmp.s=new char[tmp.size];
          for(int i=0;i<l;i++)
          {
                tmp.s[i]=a.s[i+s];
          }
          return tmp;
    }
    
    int main()
    {
          //freopen("in.txt","r",stdin);
          char a[200],ch;
          int q,w,e,r;
          cin>>a;
          s[0]=a;
          cin>>a;
          s[1]=a;
          while(cin>>ch)
          {
                if(ch=='P')
                {
                      cin>>q;
                      s[q-1].show();
                }
                else if(ch=='C')
                {
                      cin>>q>>w>>e;
                      s[e-1]=s[q-1]+s[w-1];
                }
                else if(ch=='A')
                {
                      cin>>q>>w;
                      s[w-1]=s[q-1];
                }
                else if(ch=='F')
                {
                      cin>>q>>w>>e>>r;
                      s[r-1]=sub(s[q-1],w,e);
                }
    
          }
    }
  • 相关阅读:
    BZOJ 3924 / Luogu P3345 [ZJOI2015]幻想乡战略游戏 (动态点分治/点分树)
    BZOJ 3065 带插入区间K小值 (替罪羊树套线段树)
    BZOJ 3217: ALOEXT (块状链表套trie)
    BZOJ 3514: Codechef MARCH14 GERALD07加强版 (LCT维护最大生成树+主席树)
    BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)
    BZOJ 3658: Jabberwocky (双向链表+BIT)
    BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)
    BZOJ 2759 一个动态树好题 (LCT)
    BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)
    codefroces 612E Square Root of Permutation
  • 原文地址:https://www.cnblogs.com/zgncbsylm/p/10733465.html
Copyright © 2020-2023  润新知