string类是c++默认提供的,但是了解string类的写法也是非常重要的,面试中有许多关于string类的题目,string类能够考察c++类和对象的掌握程度,一定程度上也考察了面试者的编程能力。
下面是string类的一些基本功能,由于面试的时间很短,在这极短的时间内全部实现string类的功能是不可能的,我们可以实现最基本的功能,类中的构造函数、析构函数、赋值,复制的功能。
class String
{
public:
String() //无参构造函数
:_str(new char[1])
{
_str[0] = '\0';
}
String(const char * str) //构造函数
:_str(new char[strlen(str)+1])
//多开辟一个字符的空间,因为strcpy函数会将'\0'也进行拷贝,而strlen不计算'\0';
{
strcpy(_str, str);
}
//String(const String & s) //拷贝构造函数
// :_str(new char[strlen(s._str)+1])
//{
// strcpy(_str, s._str);
//}
//现代写法
String(const String & s)
:_str(NULL)
{
String tmp(s._str);
swap(_str, tmp._str);
}
~String() //析构函数
{
if (_str != NULL)
{
delete[] _str;
_str = NULL;
_size = 0;
_capaciy = 0;
}
}
//String operator==(const String & s) //字符串相等(先开辟空间,然后释放,防止内存泄漏)
//{
// if (this != &s)
// {
// char * tmp = new char[strlen(s._str) + 1];
// strcpy(_str, s._str);
// delete[] _str;
// }
//}
//现代写法
String operator==(String s)
{
swap(_str, s._str);
return *this;
}
String operator<(const String & s) //字符串小于
{
char *tmp = s._str;
while (_str != '\0' && tmp != '\0')
{
if (_str == tmp)
{
_str++;
tmp++;
}
else if (_str < tmp)
{
return *this;
}
else
{
return s._str;
}
}
}
String operator<=(const String & s) //字符串小于等于
{
char *tmp = s._str;
if (_str <= tmp)
{
return *this;
}
else
{
return s._str;
}
}
String operator>(const String & s) //字符串大于
{
char *tmp = s._str;
while (_str != '\0' && tmp != '\0')
{
if (_str == tmp)
{
_str++;
tmp++;
}
else if (_str > tmp)
{
return *this;
}
else
{
return s._str;
}
}
}
String operator>=(const String & s) //字符串大于等于
{
char *tmp = s._str;
if (_str >= tmp)
{
return *this;
}
else
{
return s._str;
}
}
char operator[](size_t index)
{
return _str[index];
}
void pushBack(char ch) //压入栈中
{
_checkCapacity(_size + 2);
_str[_size] = ch;
_str[_size + 1] = '\0';
}
void popBack() //出栈
{
assert(_str);
_size--;
_str[_size] = '\0';
}
void Insert(size_t pos, char ch) //插入字符
{
assert(pos <= _size);
//_checkCapacity(_size);
size_t tmp = _size;
while (tmp >= pos)
{
_str[tmp + 1] = _str[tmp]; //从后往前移动
tmp--;
}
_str[pos] = ch;
_size++;
}
void Insert(size_t pos, const char *str) //插入字符串
{
assert(pos <= _size);
size_t size = strlen(str); //增容
_checkCapacity(size + 1 + _size);
size_t tmp = _size; //移位
while (tmp >= pos)
{
_str[tmp + size] = _str[tmp];
tmp--;
}
for (size_t i = 0; i < size; i++) //插入
{
_str[pos] = str[i];
pos++;
}
_size += size;
}
int Find(char ch) //查找字符
{
int pos = 1;
while (_str != '\0')
{
if (*_str == ch)
{
return pos;
}
else
{
_str++;
}
pos++;
}
return 0;
}
size_t Find(const char *sub) //查找子串
{
size_t srcIndex = 0;
size_t subSize = strlen(sub);
while (srcIndex <= _size - subSize)
{
size_t subIndex = 0;
size_t begin = srcIndex;
while (_str[begin] == sub[subIndex] && begin < _size && subIndex < subSize)
{
begin++;
subIndex++;
}
if (subIndex == subSize)
{
return srcIndex;
}
srcIndex++;
}
}
String & operator+=(const String & s) //+=
{
Insert(_size, s._str);
return *this;
}
void Display()
{
while (_str != '\0')
{
cout << *_str;
_str++;
}
}
private:
char *_str;
size_t _size;
size_t _capaciy;
private:
void _checkCapacity(size_t needsize)
{
if (needsize + 1 >= _capaciy)
{
_capaciy = needsize > 2 * _capaciy ? needsize : 2 * _capaciy;
_str = (char *)realloc(_str, _capaciy);
}
}
};
转载于:https://blog.51cto.com/10740590/1747332