目录
一、string的功能
string的主要功能是存储字符串,它可以随着字符的增加而改变自身存储的大小。
1、在字符串的最后插入一个字符
2、在字符串的最后插入一个段符串
3、在字符串中删除一段字符串
4、在字符串中查找一个字符
5、在字符串中查找一段字符串
6、可以自主扩容
……
二、string模拟实现的代码
三、string的结构
我们要模拟实现string,首先我们要知道它的基本结构,string是由一个char*指针_str,一个整形类型_size和一个整形类型_capacity组成。
即string的初始结构是这样。
class string
{
public:
typedef char* iterator;
typedef const char* const_iterator;
private:
char* _str;
size_t _capacity;
size_t _size;
};
_str用于定位头部,_size用来统计字符串的长度,_capacity用来判断是否要扩容(当_size等于_capacity的时候扩容)。
四、string的模拟实现
1、string的构造(string)
int main()
{
string st1("abcd");
string st2(st1);
string st3;
st3 = st2;
return 0;
}
C++中可以用上面三种方法初始化或赋值一个string类型的变量。
下面三个函数分别对应着上面的初始化或赋值
string(const char* str = "")
{
_size = strlen(str);
_capacity = _size;
_str = new char[_size + 1];
strcpy(_str, str);
}
string(const string& s)
{
string tmp(s.c_str());
swap(tmp);
}
string& operator=(string s)
{
swap(s);
return *this;
}
void swap(string& s)
{
std::swap(_str, s._str);
std::swap(_size,s._size);
std::swap(_capacity, s._capacity);
}
2、string的插入(insert和push_back)
string& string::insert(size_t pos, char c)
{
assert(pos < _size);
if (_size == _capacity)
{
reserve(_capacity == 0 ? 4 : _capacity * 2);
}
int end = (int)_size;
while (end >= (int)pos)
{
_str[end + 1] = _str[end];
end--;
}
_str[pos] = c;
_size++;
return *this;
}
void string::push_back(char c)
{
insert(_size - 1,c);
}
pos是我们要插入的位置,c是插入的字符,每次插入都要判断一下插入位置是否合理和是否要扩容,然后就开始进行挪位。(若要插入字符串过程类似)
string& string::insert(size_t pos, const char* str)
{
assert(pos < _size);
int len = (int)strlen(str);
int end = (int)_size;
if (end + len > _capacity)
{
reserve(end + len > _capacity * 2 ? end + len : _capacity * 2);
}
while (end>= (int)pos)
{
_str[end + len] = _str[end];
end--;
}
for (int i = 0; i < len; i++)
{
_str[pos + i] = str[i];
}
return *this;
}
3、string的删除(erase)
string& string::erase(size_t pos, size_t len = -1)
{
assert(pos < _size);
if (len > _size - pos)
{
_str[pos] = '\0';
_size = pos;
}
else
{
for (int i = pos + len; i <= _size; i++)
{
_str[i - len] = _str[i];
}
_size -= len;
}
return *this;
}
pos是删除的初始位置,len是删除长度。
删除有两种情况,一种是要删除的长度比字符串的长度短,另外一种是要删除的长度比字符串的长度长。
当要删除的长度比字符串的长度短时,从后往前挪字符。
当要删除的长度比字符串的长度长时,直接在pos位置放'\0'即可。
4、string的查找(find)
string的查找分为两种:找字符和找字符串。
当找到的时候返回位置。
size_t string::find(const char* s, size_t pos) const
{
assert(pos < _size);
char* ptr = strstr(_str, s);
if (ptr != nullptr)
{
return _str - ptr;
}
else
{
return -1;
}
}
size_t string::find(char c, size_t pos) const
{
assert(pos < _size);
for (int i = pos; i < pos; i++)
{
if (_str[i] = c)
return i;
}
return -1;
}