模拟实现string——增删查改

本文探讨了模拟实现C++中的string类,包括深浅拷贝和写时拷贝的概念。接着,详细介绍了如何实现string的增、删、查、改四个基本操作,并提供了相应的源代码。
摘要由CSDN通过智能技术生成

我们上篇和上上篇谈到了模拟实现string——深浅拷贝以及写时拷贝
这篇介绍一下增删查改

首先介绍一下它 的接口

void PushBack(char ch) 
void PushBack(const char* str) 
void PopBack() 
void Insert(size_t pos, char ch) 
void Insert(size_t pos, const char* str); 
void Erase(size_t pos, size_t count); 
size_t Find(char ch) const; 
size_t Find(const char* str) const; 
char& operator[](size_t pos) 
bool operator<(const String& s) const; 
bool operator<=(const String& s) const; 
bool operator>(const String& s) const; 
bool operator>=(const String& s) const; 
bool operator==(const String& s) const; 
bool operator!=(const String& s)const; 
void Expand(size_t n) 

下面是源代码

#include<iostream>
#include<assert.h>
#include<windows.h>
using namespace std;
#pragma warning(disable :4996)
class String
{
public:
    String(char* str = "")//无参函数也可用,构造函数
    {
        _size = strlen(str);
        _capacity = _size;
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);

    }
    //String(const String &s)     //传统写法,拷贝构造
    //  :_str(new char[strlen(s._str)+1])
    //{
    //  strcpy(_str, s._str);
    //}
    String(const String &s)    //现代写法,拷贝构造
        :_str(NULL)
        , _capacity(0)
        , _size(0)
    {
        String tmp(s._str);
        Swap(tmp);

    }
    char &operator[](size_t pos)
    {
        return _str[pos];
    }
    //String &operator=(const String &s)  //两种写法
    //{
    //  if (this != &s)
    //  {
    //      String tmp(s._str);
    //      Swap( tmp);
    //  }
    //  return *this;
    //}
    String& operator=(String s) 
    {
        Swap(s);
        return *this;
    }
    const char* GetStr()
    {
        return _str;
    }
    size_t Size()
    {
        return _size;
    }
    size_t Capacity()
    {
        return _capacity;
    }


    void Swap(String& s)
    {
        swap(_capacity, s._capacity);
        swap(_size, s._size);
        swap(_str, s._str);
    }
    ~String()  //析构函数
    {
        delete[] _str;
    }
//增删查改
    void PushBcak(char ch)   //尾插字符
    {
        if (_capacity == _size)
        {
            Expand(2 * _size);
        }
        _str[_size++] = ch;
        _str[_size] = '\0';
    }
    void PushBack(const char *str)  //尾插字符串
    {
        size_t len = strlen(str);
        if (_size+len>_capacity)
        {
            Expand(_size + len);
        }

        strcpy(_str + _size, str);
    }
    void PopBack()   //尾删
    {
        assert(_size);
        _str[_size - 1] = _str[_size];
        _size--;
    }
    void Insert(size_t pos, char ch)  //添加字符

    {
        if (_size == _capacity)
        {
            Expand(_size * 2);
        }
        int end = _size;
        while (end >= int(pos))
        {
            _str[end + 1] = _str[end];
            --end;
        }
        _str[pos] = ch;
        _size++;
    }

    void Insert(size_t pos, char*str)  //增加字符串
    {
        size_t len = strlen(str);
        if (_size+len > _capacity)
        {
            Expand(_size + len);
        }
        int end = _size;
        while (end >=(int) pos)
        {
            _str[end + len] = _str[end];
            --end;
        }
        while (*str)
        {
            _str[++pos] = *str++;

        }
        _size += len;
    }
    void Erase(size_t pos, size_t count)
    {
        if (pos + count >= _size)
        {
            _str[pos] = '\0';
            _size = pos;
        }
        else
        {
            strcpy(_str + pos, _str + pos + count);
            _size -= count;
          }

    }
    size_t Find(char ch)const
    {
        size_t i = 0;
        for (i = 0; i < _size; i++)
        {
            if (_str[i] == ch)
            {
                return i;
            }
        }
        return -1;
    }

    size_t Find(const char*str)const
    {
        assert(str);
        const char*srcStr = _str;
        const char*subStr = str;
        size_t srcIndex = 0;
        size_t subIndex = 0;
        size_t subLen = strlen(subStr);
        while (srcIndex < _size)
        {
            size_t matchIndex = srcIndex;
            while (srcStr[matchIndex] == subStr[subIndex])
            {
                ++matchIndex;
                ++subIndex;
                return srcIndex;
                if (subIndex = subLen)
                {
                    return srcIndex;
                }
            }
            subIndex = 0;
            srcIndex++;
        }
        return -1;
    }

    bool operator<(const String &s)const
    {
        size_t i = 0;
        for (size_t i = 0; i < _size&&i < s._size; ++i)
        {
            if (_str[i] < s._str[i])
            {
                return true;
            }
            else if (_str[i] > s._str[i])
            {
                return false;
            }
        }
        if (i == _size)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    bool operator<=(const String& s) const
    {
        return *this<s || *this == s;
    }
    bool operator>(const String& s) const
    {
        return !(*this <= s);
    }
    bool operator>=(const String& s) const
    {
        return *this >s || *this == s;
    }
    bool operator==(const String& s) const
    {
        size_t i = 0;
        for (size_t i = 0; i < _size&&i < s._size; ++i)
        {
            if (_str[i] != s._str[i])
            {
                return false;
            }
            if (i == _size&&i == s._size)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    }
    bool operator!=(const String& s)const
    {
        return !(*this == s);
    }
    void Expand(size_t n)
    {
        if (n > _capacity)
        {
            _str = (char*)realloc(_str, n + 1);
            assert(_str);
            _capacity = n;
        }
    }

private:
    char *_str;
    size_t _capacity;
    size_t _size;
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值