相信都用过stl里面的std::string 类,现在我们尝试一下实现自己的string类。
首先进行分析,我们需要一个数组或者指针来保存字符串,
还需要一个成员变量表示长度,
另外还需要一个成员变量表示总的分配的数组空间的大小。
需要实现哪些功能点?
1.stl迭代器的功能begin(),end()这种
2.能够通过[]进行str[3],str[4]这种,输出对应的字符
3.能够使用赋值运算符
4.能够直接输出里面的内容
5.内容重新分配内存的空间大小
简单的实现功能
1.因为我们有成员变量size 表示数组的长度,可以简单找到头尾的位置。
2.重载[]操作符
3.重载=符号
4.遍历数组里面的字符进行输出
5.根据输入的参数,创建新的空间,把旧的字符拷贝过去然后删除旧的空间
6.充分的利用strlen ,strcpy new 这几个函数和操作符。
具体实现
#include <string.h>
#include <iostream>
#include <assert.h>
class MyString
{
public:
MyString();
MyString(const char* str) {
_size = strlen(str);
_str = new char[_size + 1];
_capacity = _size;
}
~MyString();
public:
typedef char* iterator;
typedef const char* const_iterator;
iterator begin()
{
return _str;
}
iterator end()
{
return _str + _size;
}
const_iterator begin() const
{
return _str;
}
const_iterator end() const {
return _str + _size;
}
public:
char& operator[](size_t pos) {
assert(pos < _size);
return _str[pos];
}
MyString(const MyString& string) {
_size = string._size;
_str = new char[_size + 1];
strcpy_s(_str, _size + 1, string._str);
_capacity = _size;
}
MyString& operator=(const MyString& string) {
if (this != &string)
{
delete[] _str;
_capacity = _size = string._size;
_str = new char[_size + 1];
strcpy_s(_str, _size + 1, string._str);
}
return *this;
}
void print(const MyString& str)
{
MyString::const_iterator it = str.begin();
while (it != str.end())
{
std::cout << *it;
it++;
}
}
void reserve(size_t n)
{
if (n > _capacity)
{
char* tmp = new char[n + 1];
strcpy_s(tmp, _size,_str);
delete[] _str;
_str = tmp;
}
_capacity = n;
}
void resize(size_t n, char str = '\0')
{
if (n <= _size)
{
_size = n;
_str[n] = '\0';
}
else
{
if (n > _capacity)
{
reserve(n);
}
for (size_t m = _size; m < n; m++)
{
_str[m] = str;
}
_size = n;
_str[_size] = '\0';
}
}
private:
char* _str;
size_t _size;
size_t _capacity;
};