String类增删改查的实现

来源:互联网 发布:网络接入服务商怎么查 编辑:程序博客网 时间:2024/04/18 18:54

实现String类的增删改查,代码如下:

//Stringclass.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include<string>#include<iostream>#include"assert.h"using namespace std;class Stringclass{public:    Stringclass(char*  str = " ") :_str(new char[strlen(str) + 1]), _size(strlen(str)), _capacity(strlen(str))    {        strcpy(_str, str);    }    Stringclass(const Stringclass& s) :_str(new char[strlen(s._str) + 1])//拷贝构造,这里使用传统的深拷贝方法,自己开辟空间,自己拷贝    {        strcpy(_str, s._str);        _size = strlen(s._str);        _capacity = strlen(s._str);    }    Stringclass& operator=(Stringclass s)//赋值运算符重载,这里传参调用了拷贝构造    {        Swap(s);        return *this;    }    void Swap(Stringclass& s)    {        swap(_str, s._str);        _size = s._size;        _capacity = s._capacity;    }    ~Stringclass()//析构函数    {        if (_str)        {            delete[] _str;            _str = NULL;        }        _size = 0;        _capacity = 0;    }    char*GetStr()    {        return _str;    }    size_t Size()    {        return _size;    }    size_t Capacity()    {        return _capacity;    }    // 增删查改     void PushBack(char ch)    {        if (_size == _capacity)        {            Expand(2 * _capacity + 1);        }        _str[_size] = ch;        ++_size;        _str[_size] = '\0';    }    void PushBack(const char* str)    {        size_t len = strlen(str);        if ((_size + len) > _capacity)        {            Expand(_size + len + 1);        }        for (size_t i = 0; i < len; ++i)        {            _str[i + _size] = str[i];        }        _size = _size + len;        _str[_size] = '\0';        _capacity = _size + len;    }    void PopBack()    {        if (_size == 0)        {            printf("It is empty!");            return;        }        else        {            _str[_size - 1] = '\0';            --_size;        }    }    void Expand(size_t n)    {        char* tmp = new char[n];        strcpy(tmp, _str);        _str = tmp;        _capacity = n - 1;    }    void Insert(size_t pos, char ch)    {        if (_size == _capacity)        {            Expand(2 * _capacity + 1);        }        size_t end = _size;        assert(pos < end);        while (pos < end)        {            _str[end] = _str[end - 1];            end--;        }        _str[pos] = ch;        ++_size;        _str[_size] = '\0';    }    void Insert(size_t pos, const char* str)    {        size_t len = strlen(str);        if ((_size + len) > _capacity)        {            Expand(_size + len + 1);        }        size_t end = _size;        assert(pos < end);        while ((int)pos < end)        {            _str[end + len] = _str[end];            end--;        }        while (len--)        {            _str[pos] = *str++;        }        _size = _size + len;        _str[_size] = '\0';    }    /*void Erase(size_t pos, size_t count)    {        assert(pos + count<_size);        size_t index = pos + count;        while (*(_str + index) != '\0')        {            _str[index - count] = _str[index];            index++;        }        _size = _size - count;        _str[_size] = '\0';    }*/    void Erase(size_t pos, size_t count)    {        assert(pos<_size);        if (pos + count > _size)        {            _str[pos] = '\0';            _size = pos;        }        else        {            for (size_t i = pos + count; i <= _size; i++)            {                _str[pos++] = _str[i];            }            _size -= count;        }    }    size_t Find(char ch) const    {        for (size_t i = 0; i < _size; i++)        {            if (_str[i] == ch)            {                return i;            }        }        return NULL;    }    size_t Find(const char* str) //查找字符串中str字符串第一次出现的位置    {        const char* sub = str;        const char* src = _str;        for (size_t i = 0; i < _size; i++)        {            src = _str + i;            const char* sub_ = sub;            const char* src_ = src;            while (*sub_&&*sub_ == *src_)            {                sub_++;                src_++;            }            if (*sub_ == '\0')            {                return i;            }          }                     /*const char* sub = str;        const char* src = _str;        while (*src)        {            const char* sub_ = sub;            const char* src_ = src;            while (*sub_&&*sub_ == *src_)            {                sub_++;                src_++;            }            if (*sub_ == '\0')            {                return (src - _str);            }            src++;        }*/        return -1;    }    char& operator[](size_t pos)    {        assert(pos <= strlen(_str));        return _str[pos];    }    bool operator<(const Stringclass& s) const    {        // hello < hello        // hello1 < hello        // hello < hello2        char* str1 = _str;        char* str2 = s._str;        while (*str1&&*str2)        {            if (*str1 < *str2)            {                return true;            }            else if (*str1>*str2)            {                return false;            }            else            {                str1++;                str2++;            }        }        if (*str1 == '\0'&&*str2!='\0')        {            return true;        }        else        {            return false;        }    }    bool operator<=(const Stringclass& s) const    {        char* str1 = _str;        char* str2 = s._str;        while (*str1&&*str2)        {            if (*str1 < *str2)            {                return true;            }            else if (*str1>*str2)            {                return false;            }            else            {                str1++;                str2++;            }        }        if (*str1 == '\0')        {            return true;        }        else        {            return false;        }    }    bool operator>(const Stringclass& s) const    {        bool ret = this->operator<=(s);        return (!(ret));    }    bool operator>=(const Stringclass& s) const    {        return !(this->operator<(s));    }    bool operator==(const Stringclass& s) const    {        char* str1 = _str;        char* str2 = s._str;        while(*str1 && *str2)        {            if (*str1 == *str2)            {                str1++;                str2++;            }            else            {                return false;            }          }        if (*str1 == '\0'&&*str2 == '\0')        {            return true;        }        else        {            return false;        }           }    bool operator!=(const Stringclass& s)const    {        return !(this->operator == (s));    }private:    char* _str;    size_t _size;//字符个数    size_t _capacity;//容量空间};
//test.cpp#include"Stringclass.h"void Test(){    Stringclass s1;    cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl;    Stringclass s2("abcdefgh");    cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl;    Stringclass s3;    s3 = s2;    cout << s3.GetStr() << ":" << s3.Size() << ":" << s3.Capacity() << endl;    s2.PushBack('a');    s2.PushBack('b');    s2.PushBack('c');    s2.PushBack('d');    cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl;    char* s = "abcd";    s3.PushBack(s);    cout << s3.GetStr() << ":" << s3.Size() << ":" << s3.Capacity() << endl;    s2.PopBack();    s2.PopBack();    s2.PopBack();    s2.PopBack();    cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl;}void Test2(){    Stringclass s1("ababab");    Stringclass s2("efghijklmn");    Stringclass s3("ababab");    Stringclass s4("ababa");    Stringclass s5("abababb");    cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl;    s1.Insert(3, 'c');    cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl;    s1.Erase(3, 2);    cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl;    cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl;    cout << s2.Find('i')<<endl;    char* str1 = "gh";    char* str2 = "kl";    cout << s2.Find(str1) << endl;    cout << s2.Find(str2) << endl;    s1 = s3;    cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl;    cout << (s1 == s2) << endl;    cout << (s1 != s2) << endl;    cout << (s1 < s3) << endl;    cout << (s1 < s4) << endl;    cout << (s1 < s5) << endl;    cout << (s1 <= s3) << endl;    cout << (s1 <= s4) << endl;    cout << (s1 <= s5) << endl;    cout << (s1 > s3) << endl;    cout << (s1 > s4) << endl;    cout << (s1 > s5) << endl;    cout << (s1 >= s3) << endl;    cout << (s1 >= s4) << endl;    cout << (s1 >= s5) << endl;}int main(){    //Test();    Test2();    system("pause");    return 0;}

运行test()测试结果如下:
这里写图片描述
运行test2()测试结果如下:
这里写图片描述

原创粉丝点击