调整操作
push_back()
这个函数负责在字符串末尾追加单个字符。核心逻辑在于先判断容量是否充足,如果不够就扩容,最后记得补上结束符 \0。
void string::push_back(char c) {
// 检查是否需要扩容
if (_size == _capacity) {
// 这里采用 2 倍扩容,或者你也可以 1.5 倍扩容
size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;
reserve(newcapacity);
_capacity = newcapacity;
}
// 插入字符和 \0
_str[_size++] = c;
_str[_size] = '\0';
}
append()
append() 有很多重载,我们主要关注追加字符串和追加多个相同字符这两种场景。
追加字符串
需要断言指针不为空,计算长度,判断容量并扩容,最后利用 strcpy 拷贝数据。
void string::append(const char* str) {
assert(str);
size_t len = strlen(str);
// 扩容
if (_capacity < len + _size) {
size_t newcapacity = len + _size > 2 * _capacity ? len + _size : 2 * _capacity;
reserve(newcapacity);
_capacity = newcapacity;
}
// 追加新的数据,strcpy 会拷贝\0,所以不需要手动加
strcpy(_str + _size, str);
_size += len;
}
追加多个相同字符
逻辑类似,只是循环写入字符。如果复用了 push_back,就不需要手动加 \0 了。
{
(_capacity < n + _size) {
newcapacity = n + _size > * _capacity ? n + _size : * _capacity;
(newcapacity);
_capacity = newcapacity;
}
( i = ; i < n; i++) {
_str[_size++] = c;
}
_str[_size] = ;
}


