改变当前sting对象空间容量的大小,如果需要改变的容量大小大于string对象的实际容量,就重新申请空间,扩容,否则就不需要扩容。
无返回值
(1)判断需要扩容的容量n是否大于当前对象的实际容量
(2)在堆上申请大小n为的空间
(3)将对象中的字符串拷贝到在堆上新开辟的空间上,并释放该字符串指向的堆上的空间
(4)改变当前对象的实际容量值
//增容改变空间大小,只有当要增容的空间大小大于当前对象的容量的时候,才增容
void reserve(size_t n)
{
if (n > _capacity)
{
char* tmp = new char[n + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = n;
}
}
改变当前sting对象的字符串的实际个数以及改变容量大小,并且初始化
无返回值
(1)判断需要改变的容量n是否大于当前对象的实际个数
(2)如果n小于等于当前对象的实际个数,就将字符串的第n个字符赋值为字符串的结束标识符'\0',并改变字符串的实际个数为n
(3)如果n大于等于当前对象的实际个数并且大于当前对象的实际容量,就调用reserve函数扩容string的实际容量到n
(4)调用memset函数将扩容出来的空间,全部初始化为str,str默认初始值为'\0'
(5)再改变当前对象的实际大小为n,将字符串的第n个字符赋值为字符串的结束标识
//改变字符串的实际个数以及改变容量大小,并且初始化
void resize(size_t n, char str = '\0')
{
if (n <= size())
{
_str[n] = '\0';
_size = n;
}
else
{
if (n > capacity())
{
reserve(n);
}
memset(_str + _size, str, n - _size);
_size = n;
_str[_size] = '\0';
}
}
在string字符串中的任意位置插入单个字符或是字符串,所以它有两个重载函数
返回插入字符或是字符串之后的string对象
(1)判断需要插入的字符串的长度(len)加上插入的下标的值的和n是否大于当前对象的实际容量
(2)如果n大于当前对象的实际容量,就将对象的实际容量扩为n
(3)声明一个变量end,它是该对象的字符串中的最后一个元素('\0')移len个位后的后一个下标,这样end永远指向需要移位的元素的下一个位置
(4)进行数组移位操作,将对象中的字符串移位至len个元素之后
(5)通过调用strncpy(该函数可以将一个字符串中的n个元素拷贝至另一个字符串中)函数,再将需要插入的字符串拷贝至当前对象的字符串中,然后改变字符串的字符实际个数
//在任意位置插入字符串
string& insert(size_t pos, const char* str)
{
assert(pos <= _size);
size_t len = strlen(str);
if (len + _size > _capacity)
{
reserve(len + _size);
}
size_t end = _size + len + 1;
while (end > pos + len)
{
_str[end - 1] = _str[end - len - 1];
end--;
}
strncpy(_str + pos, str, len);
_size += len;
return *this;
}
//在任意位置插入字符
string& insert(size_t pos, char ch)
{
assert(pos <= _size);
if (_size == _capacity)
{
_capacity == 0 ? reserve(4) : reserve(2 * _capacity);
}
size_t end = _size + 1;//此处不能使end = _size,因为当end = pos时,end--,就会发生数组越界
while (end > pos)
{
_str[end] = _str[end - 1];
end--;
}
_str[pos] = ch;
_size++;
return *this;
}
从sting字符串的第pos个下标开始,删除长度为len的数据
返回删除字符之后的string对象
(1)如果开始删除的数据的下标pos加上需要删除的个数len大于等于字符串的实际个数大小,就将下标为pos的数据赋值为字符串结束标识符('\0')
(2)否则就调用strycpy函数,将字符串数组中pos+len后的数据拷贝到pos下标处
(3)改变对象中的实际元素个数_size的值
(4)返回当前对象
//删除字符串
string& erase(size_t pos = 0, size_t len = npos)
{
assert(pos < _size);
if (pos + len >= _size)
{
_str[pos] = '\0';
_size = pos;
}
else
{
strcpy(_str + pos, _str + pos + len);
//strncpy(_str + pos, _str + pos + len, _size - pos - len + 1);
_size -= len;
}
return *this;
}
//清除字符串
void clear()
{
_str[0] = '\0';
_size = 0;
}
从sting字符串中找到对应的字符和字符串
找到返回首字母的下标,如果没找到就返回-1
查找单个字符:
(1)通过迭代器遍历每一个字符
(2)找到对应字符,返回字符下标
(3)如果没找到就返回-1
查找字符串:
(1)通过strstr函数,找到字符串在该string字符串里面的首字母的指针
(2)通过得到的指针,返回它在字符串中的位置
//查找字符
size_t find(char ch) const
{
auto it = begin();
while (it != end())
{
if (*it == ch)
{
return (it - _str);
}
it++;
}
return npos;
}
//查找字符串
size_t find(const char* str) const
{
char* res = strstr(_str, str);
if (res != nullptr)
{
return (res - _str);
}
return npos;
}
通过对象[ int n ]来实现对字符串里指定元素的访问和修改
根据【】里的值,返回当前字符串中的指定的元素
直接返回下标为pos的字符串元素的引用
//2.取值符号[]重载
char& operator[](size_t pos)
{
assert(pos < _size);
return _str[pos];
}