本章说:关于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;
}