引入
学习完string类的之后,为了加深自己对string类的理解,我们可以选择不用c++string库(<string>),而用我们之前的c语言学习的cstring(<cstring>(<string.h>))库函数(间接地也巩固了自己对cstring中函数的运用)来模拟实现c++string类的功能,这里我只模拟了常用得string类中的方法。具体代码如下:
复习常用的cstring函数
int puts(char* str)
其作用是将一个字符串(以'\0'结束的字符序列)输入到终端。
int gets(const char* str)
其作用是从终端输入一个字符串到字符数组中
strcat(char* str1,char* str2)
其作用是将str2拼接到str1的末尾(拼接时函数会将str1末尾的'\0'取消)
strncat(char* str1,char* str2)
将str2的前n个字符拼接到str1的后面
strcpy(char* str1,char*str2)
其作用是将str2的内容复制到str1(拼接时函数会将str1末尾的'\0'取消)
strncpy(char* str1,char*str2,n)
其作用是将str2前n个字符的内容复制到str1
strcpy是将str和其后的'\0'都复制到了str1中
验证
void memset (void* ptr,int value,size_t num)
将ptr指向的内存前num个设为一个确定值
using namespace std;
class String{//string("str")string(size_t n,char c)
public:
//构造和析构
String(int n,char c=' ')
{
if (n < 0){
assert(false);
}
_str = new char[n + 1];
memset(_str, c, n);
_capacity = _size = strlen(_str);
}
String(const char* str = "")
{
if (str == nullptr)
assert(false);
_str = new char[strlen(str) + 1];
strcpy(_str, str);
_capacity = _size = strlen(str);
}
String(const String &s)
:_capacity(s._capacity)
,_size(s._size)
{
_str = new char[s._capacity + 1];
strcpy(_str, s._str);
}
String operator =(String &s){
if (this != &s){
char* temp=new char[s._capacity+1];
strcpy(temp, s._str);
delete[] _str;
_str = temp;
_capacity = s._capacity;
_size = s._size;
}
return *this;
}
~String(){
if (_str!=nullptr )
{
delete[] _str;
_str = nullptr;
}
}
//容量相关的函数
void Swap(String& s2){
swap(_capacity, s2._capacity);
swap(_size, s2._size);
swap(_str, s2._str);
}
size_t capacity(){
return _capacity;
}
size_t size(){
return _size;
}
bool empty(){
return _size == 0;
}
void resize(size_t n, char c = '\0'){
if ((int)n > _size)//说明要扩容
{
if((int)n>_capacity)
reserve(n + 1);
memset(_str+_size, c, n - _size);
}
_size = n;
}
void reserve(size_t n){
if (n > _capacity){
char* newadd = new char[n+1];
strcpy(newadd, _str);
delete[] _str;
_str = newadd;
newadd = nullptr;
_capacity = n-1;
}
}
//迭代器
typedef char* iterator;
typedef char* reverse_iterator;
iterator begin(){
return _str;
}
iterator end(){
return _str + _size - 1;
}
//访问元素的相关函数
char* operator [](size_t n){
if (n > _size)
return _str + _size;
else return _str + n - 1;
}
//修改元素的相关操作
void push_back(char c)
{
if ( _size+1 > _capacity)
reserve( _size + 2);
_str[_size++] = c;
_str[_size] = '\0';
}
void append(size_t n, char c)
{
while (n)
{
push_back(c);
n--;
}
_size += n;
}
void append(char* str){
if (strlen(str) + _size > _capacity){
reserve(strlen(str) + _size+1);
}
strcat(_str, str);
_size = strlen(str )+_size;
_capacity = _size;
}
void clear()
{
char* newadd=new char[strlen(_str)+1];
delete[] _str;
_str = newadd;
_size = 0;
}
//其他
size_t find(char c, size_t pos)const
{
for (size_t i = pos; i <= _size; i++)
{
if (c == _str[i - 1])
return i;
}
return false;
}
size_t find(char* str, size_t pos)const
{
assert(str || pos <= _size);
char* it1 = _str;
char* it2 = str;
for (size_t i = pos; i < _size;i++)
{
it1 = _str + i - 1;
while (it1 || it2){
if (*it1 == *it2)
{
++it1;
++it2;
}
else
break;
}
if (*it2 == '\0')
return i;
}
return false;
}
private:
char* _str;
size_t _capacity;
size_t _size;
};
//验证构造析构以及赋值运算符重载
void teststring1()
{
String s1;
String s2("hello");
String s3(s2);
String s4(5, 'b');
s1 = s4;
}//验证append push_back
void teststring2()
{
String s1("hello");
s1.push_back(' ');
//s1.append(2, 'x');
s1.append("zjb!");
}//验证find
void teststring3(){
String s1("I can't breath");
int x=s1.find('c', 1);
int y = s1.find("brea", 1);
}
int main(){
teststring3();
system("pause");
return 0;
}
参考cpluspuls.com