string类的模拟实现

本章说:关于string类的模拟实现本质上是为了提升自己对string一系列函数的理解,本篇则会讲解几个重点函数的模拟实现。

一、reserve()函数

1.reserve的功能介绍:

(1)reserve(size_t n = 0),将字符串的大小开辟成n个。

(2)如果n大于当前字符串的容量大小,则会将字符串的容量大小开辟至n个字符或者更大。

(3)该函数不会对字符串长度造成影响,且不能修改其内容。(n小于字符串大小时什么都不会发生)

2.C++数据库中的reserve函数:https://cplusplus.com/reference/string/string/reserve/

3.模拟实现的reserve:

	void string::reserve(size_t n)//注意,类函数的声明和定义应当分离,即声明在头文件中,定义在.cpp中实现
     {
           if (n>_capacity)
              {
                char* tmp = new char[_str];//空间改变的本质是构造一个足够大或足够小的新空间,然后将原本空间的值复制给新空间,记得要释放旧空间,否则会导致内存泄漏
                strcpy(tmp,_str);//strcpy函数可将右侧的字符串拷贝给左边的字符串
                delete[] _str;//delete[]用来删除连续的空间
                _str = tmp;//使_str重新指向字符串
              }
     }
   

二、resize()函数

1.resize的功能介绍:

(1)resize(size_t n)/ resize(size_t n , char c),将字符串的大小调整为n个字符的长度。

(2)如果n小于该字符串长度,则将其缩短为n个字符的长度,并删除第n个字符之后的字符。

(3)如果n大于该字符串长度,则将其扩大为n个字符的大小,且当为resize(size_t n)时,默认以0来在其末尾插入到n个字符大小,如果为resize(size_t n, char c)时,则默认以c来填充。

2.C++数据库中的resize函数:

cplusplus.com/reference/string/string/resize/

3.模拟实现resize:

  void string::resize(size_t newSize) {
        if (newSize <= capacity) {
            return; // 如果新大小小于等于当前容量,无需做任何操作
        }

        // 扩大数据指针指向的空间
        T* newData = new T[newSize];
        if (!newData) {
            throw std::bad_alloc(); // 内存分配失败
        }

        // 将原有元素复制到新的空间
        for (std::size_t i = 0; i < size; ++i) {
            newData[i] = data[i];
        }

        delete[] data; // 释放旧内存
        data = newData;
        capacity = newSize;
        size = size < newSize ? size : newSize; // 更新实际大小
    }

三、clear()函数

1.clear的功能介绍:删除字符串中的内容,将该字符串变为空字符串(长度为0个字符)

2.C++数据库中的clear函数:cplusplus.com/reference/string/string/clear/

3.clear函数的模拟实现:

void clear()//该函数为内联函数,写在类里面,所以隐藏了一个this指针
{
    _str = '\0';
    _size = 0;
}

四、append函数和operator+=函数(由于这两个函数有多种参数形式,但用法相同,所以这里只展示字符串作为参数的函数)

1.string& operator+= (const string& str) string& append (const string& str)的功能介绍:通过在字符串的当前值末尾追加其他字符来扩展字符串。

2.C++数据库中的operator+=和append函数:cplusplus.com/reference/string/string/operator+=/

cplusplus.com/reference/string/string/operator+=/

3.operator+=和append函数的模拟实现:

	void string::append(const char* str)
    {
         size_t len = strlen(str);
         if (_size+len>capacity)
            reserve(_size + len > 2 * capacity ? _size + len : 2 * capacity );//该reserve使用的是前文中实现的函数
         strcpy(_size+len , str);
         _size += len;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值