每一次增加字符或者字符串都得检查 是否需要扩容
扩容用到得reserve函数参考下面这篇博客string类的模拟实现(二)—— 扩容_abs(ln(1+NaN))的博客-CSDN博客string有两种扩容方式,一种是 仅仅简单的扩容,不初始化,另一种是 扩容的同时还会初始化https://blog.csdn.net/challenglistic/article/details/123976598?spm=1001.2014.3001.5501
目录
增加字符最常用的是在末尾增加字符或者字符串,除此之外,我们还需要设计能在任意位置插入字符的函数
值得一提的是,凡是增加字符,最开始都得判断 是否需要扩容
1、在末尾增加字符 push_back
(1) 先检查是否要扩容,如果要扩容,那就先扩容
需要注意:判断_capacity 是否等于 0,若通过默认构造函数初始化,_capacity的初始值为 0
(2) 然后把要增加的字符放到 _str末尾
(3) 有效字符个数 _size 加 1
(4) 末尾加上 \0
void push_back(char ch)
{
//判断是否需要增容
if (_size == _capacity)
{
_capacity = _capacity == 0 ? 1 : _capacity;
reserve(_capacity * 2); //1.5倍扩容
}
_str[_size] = ch; //此时的_size没有发生变化
_size++;
_str[_size] = '\0'; //在末尾加上 '\0'
}
代码测试:
int main() {
MyString s4;
s4.push_back('a');
s4.push_back('b');
s4.push_back('c');
return 0;
}
2、在末尾增加字符串 append
(1) 添加字符串其实就是添加多个字符,所以得知道 需要添加多少个字符
(2) 判断当前容量是否能容得下 新增的多个字符
(3) 把新增的字符拷贝到 _str中
(4) 更新_size
void append(const char* str)
{
int len = strlen(str);
if (_size + len > _capacity)
{
reserve(_size + len);
}
strcpy(_str + _size, str); //从_str + _size 的位置开始存放 str拷贝的数据
_size += len; //输入的字符串中自带'\0',无需自己另外加
}
代码测试:
int main() {
MyString s4;
s4.append("abcdefg");
return 0;
}
3、在任意位置增加字符 insert
(1) pos代表要插入的位置,若超出范围则直接返回
(2) 判断是否需要扩容
(3) 通过while循环,将pos及以后的字符,向后移动一个位置
(4) 最后把字符赋值给 第 pos 个位置
void insert(char ch, int pos)
{
if (pos > _size)
return;
//判断是否需要增容
if (_size == _capacity)
{
_capacity = _capacity == 0 ? 1 : _capacity;
reserve(_capacity * 2); //1.5倍扩容
}
int end = _size;
while (end >= pos)
{
_str[end + 1] = _str[end];
end--;
}
_str[pos] = ch;
}
代码测试:
int main() {
MyString s4("abcd");
s4.insert('A', 2);
return 0;
}
4、在任意位置插入字符串 insert
插入单个字符是把pos及以后的每个字符向后移动 1 位
假设字符串的长度是len,插入一个字符串就需要把pos 及以后的字符向后移动 len 位
void insert(const char* s, int pos)
{
if (pos > _size)
return;
int len = strlen(s);
//判断是否需要增容
if (_size + len > _capacity)
{
reserve(_size + len);
}
int end = _size;
while (end >= pos)
{
_str[end + len] = _str[end]; //把每个字符向后移动len位
end--;
}
for (size_t i = 0; i < len; i++)
{
_str[pos + i] = s[i]; //把 s 中的每个字符逐个放到空出来的位置
}
}
代码测试:
int main() {
MyString s4("abcd");
s4.insert("AB", 2);
return 0;
}
5、重载运算符 +=
这个我们放到 string类的模拟实现的运算符重载说明