string类的扩容有 两个函数:
(1) reserve:仅仅只是扩容
(2) resize:除了扩容外,还会对每一个字节初始化
目录
一、无初始化扩容 reserve
(1) 先开辟一个新的空间,然后把原空间的内容拷贝到新空间
(2) 释放原来的空间
(3) 让 _str 指向新空间
void reserve(int n)
{
if (n > _capacity)
{
char* tmp = new char[n + 1]; //新开辟一个大小为 n 的空间,返回空间地址给tmp
strcpy(tmp, _str); //把原来空间上的内容拷贝到新空间
delete[] _str; //清除原本的空间
_str = tmp; //_str指向新空间
_capacity = n; //更新容量大小
}
}
代码测试:
int main() {
MyString s4("abcd");
s4.reserve(7);
return 0;
}
二、含初始化扩容 resize
(1) 判断是 扩容还是缩容
(2) 如果是缩容,则需要把字符串的结束符 '\0' 放到新容量的末尾
如果是扩容,那就调用reserve函数,然后对新增的 n - _size 个空间初始化,初始化为什么,可自定
void MyString::resize(int n, char ch)
{
if (n < _capacity)
{
_str[n] = '\0'; //缩容
_capacity = n; //更新容量
}
else
{
//n == _capacity的情况无需任何操作
if (n > _capacity)
{
reserve(n); //扩容(_capacity在reserve函数中更新)
}
memset(_str + _size, ch, n - _size); //从_str 的 _size 处开始初始化,把n-_size个位置初始化为 ch
}
}
代码测试:
int main() {
MyString s4("abcd");
s4.resize(7);
return 0;
}