C++:string的模拟实现

目录

一、string的功能

二、string模拟实现的代码

三、string的结构

四、string的模拟实现

     1、string的构造

   2、string的插入

   3、string的删除

   4、string的查找


一、string的功能

        string的主要功能是存储字符串,它可以随着字符的增加而改变自身存储的大小。

1、在字符串的最后插入一个字符

2、在字符串的最后插入一个段符串

3、在字符串中删除一段字符串

4、在字符串中查找一个字符

5、在字符串中查找一段字符串

6、可以自主扩容

……


二、string模拟实现的代码

 string的模拟实现的代码


三、string的结构

        我们要模拟实现string,首先我们要知道它的基本结构,string是由一个char*指针_str,一个整形类型_size和一个整形类型_capacity组成。

即string的初始结构是这样。 

class string
{
public:
    typedef char* iterator;
    typedef const char* const_iterator;
private:
    char* _str;
    size_t _capacity;
    size_t _size;
};

_str用于定位头部,_size用来统计字符串的长度,_capacity用来判断是否要扩容(当_size等于_capacity的时候扩容)。


四、string的模拟实现

     1、string的构造(string)

int main()
{
    string st1("abcd");
    string st2(st1);
    string st3;
    st3 = st2;

    return 0;
}

         C++中可以用上面三种方法初始化或赋值一个string类型的变量。

        下面三个函数分别对应着上面的初始化或赋值

string(const char* str = "")
{
    _size = strlen(str);
    _capacity = _size;
    _str = new char[_size + 1];
    strcpy(_str, str);
}

string(const string& s)
{
    string tmp(s.c_str());
    swap(tmp);
}

string& operator=(string s)
{
    swap(s);
    return *this;
}

void swap(string& s)
{
    std::swap(_str, s._str);
    std::swap(_size,s._size);
    std::swap(_capacity, s._capacity);
}

   2、string的插入(insert和push_back)

string& string::insert(size_t pos, char c)
{
    assert(pos < _size);
    if (_size == _capacity)
    {
        reserve(_capacity == 0 ? 4 : _capacity * 2);
    }

    int end = (int)_size;
    while (end >= (int)pos)
    {
        _str[end + 1] = _str[end];
        end--;
    }
    _str[pos] = c;
    _size++;
    return *this;
}

void string::push_back(char c)
{
    insert(_size - 1,c);
}

pos是我们要插入的位置,c是插入的字符,每次插入都要判断一下插入位置是否合理和是否要扩容,然后就开始进行挪位。(若要插入字符串过程类似)

string& string::insert(size_t pos, const char* str)
{
    assert(pos < _size);
    int len = (int)strlen(str);
    int end = (int)_size;

    if (end + len > _capacity)
    {
        reserve(end + len > _capacity * 2 ? end + len : _capacity * 2);
    }

    while (end>= (int)pos)
    {
        _str[end + len] = _str[end];
        end--;
    }
    for (int i = 0; i < len; i++)
    {
        _str[pos + i] = str[i];
    }
    return *this;
}

   3、string的删除(erase)

string& string::erase(size_t pos, size_t len = -1)
{
    assert(pos < _size);

    if (len > _size - pos)
    {
        _str[pos] = '\0';
        _size = pos;
    }
    else
    {
        for (int i = pos + len; i <= _size; i++)
        {
            _str[i - len] = _str[i];
        }
        _size -= len;
    }
    return *this;
}

pos是删除的初始位置,len是删除长度。

删除有两种情况,一种是要删除的长度比字符串的长度短,另外一种是要删除的长度比字符串的长度长。

当要删除的长度比字符串的长度短时,从后往前挪字符。

当要删除的长度比字符串的长度长时,直接在pos位置放'\0'即可。


   4、string的查找(find)

string的查找分为两种:找字符和找字符串。

当找到的时候返回位置。

size_t string::find(const char* s, size_t pos) const
{
    assert(pos < _size);

    char* ptr = strstr(_str, s);
    if (ptr != nullptr)
    {
        return _str - ptr;
    }
    else
    {
        return -1;
    }
}

size_t string::find(char c, size_t pos) const
{
    assert(pos < _size);

    for (int i = pos; i < pos; i++)
    {
        if (_str[i] = c)
            return i;
    }
    return -1;
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值