代码
模拟string
cpp
namespace lld
{
class string
{
public:
typedef char* iterator;
typedef const char* const_iterator;//const迭代器,指向内容不可以修改
iterator begin()
{
return _str;
}
iterator end()
{
return _str + _size;
}
const_iterator begin() const
{
return _str;
}
const_iterator end() const
{
return _str + _size;
}
/*string()
:_str(new char[1]),//为了和有参保持一致,析构时方便快捷
_size(0),
_capacity(0)
{
_str[0] = '\0';
}*/
//string(const char* str = nullptr)//strlen(str)直接崩溃
//string(const char* str = '\0')//这是一个字符常量,表示空字符(null character)。
//string(const char* str = "\0")//画蛇添足,因为""默认就是\0,以空字符结尾的字符串数组,长度为1。
string(const char* str = "") //全缺省构造函数
:_size(strlen(str))
{
_capacity = _size;
_str = new char[_capacity + 1];
strcpy(_str, str);
}
//拷贝构造
string(const string& s)
:_size(s._size)
,_capacity(s._capacity)
{
_str = new char[_capacity + 1];
strcpy(_str, s._str);
}
//赋值
//直接释放旧空间,开辟新空间,赋值
string& operator=(const string& s)
{
if (this != &s)
{
char* tmp = new char[s._capacity + 1];//防止开辟失败
strcpy(tmp, s._str);
delete[] _str;
_str = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
//析构
~string()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
//重构方括号
char& operator[](size_t pos)
{
assert(pos < _size);
return _str[pos];
}
const char& operator[](size_t pos) const//在同一个类中,可以定义多个重载的成员函数,它们的函数名相同,但参数列表(包括 const 属性)不同。
{
assert(pos < _size);
return _str[pos];
}
size_t size() const
{
return _size;
}
bool operator>(const string& s) const
{
return strcmp(_str, s._str) > 0;
}
bool operator==(const string& s) const
{
return strcmp(_str, s._str) == 0;
}
bool operator>=(const string& s) const
{
return *this > s || *this == s;
}
bool operator<(const string& s) const
{
return !(*this >= s);
}
bool operator<=(const string& s) const
{
return !(*this > s);
}
bool operator!=(const string& s) const
{
return !(*this == s);
}
private:
char* _str;
size_t _size;
size_t _capacity;
};
}