C++ 模拟String类 相关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 模拟String类 相关相关的知识,希望对你有一定的参考价值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cassert>
using namespace std;
//string 编写
/*版本1 以前的版本*/
/***************
class String
{
public:
//错误 String(char *str = NULL)
String(char *str = "")
:_str(new char[strlen(str) + 1])
{
}
String(const String& str)
{
_str = new char[strlen(str._str) + 1];
strcpy(_str, str._str);
}
String& operator=(const String& str)
{
if(this != &str)//防止出错 不光是效率
{
delete[] _str;//防止内存泄漏
_str = new char[strlen(str._str) + 1];
strcpy(_str, str._str);
}
return *this;
}
~String()
{
if(_str != NULL)
{
delete[] _str;
_str = NULL;
}
}
private:
char* _str;
};
**************/
//##########################################
#if 0
/*版本2 string()*/
class String
{
public:
String(char *str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
String(const String& str)
:_str(NULL)
{
String tmp(str._str);
swap(_str, tmp._str);
}
~String()
{
if(_str != NULL)
delete[] _str;
}
String& operator=(const String &str)
{
if(this != &str)
{
String tmp(str);
swap(_str, tmp._str);
}
return *this;
}
public:
bool operator==(String &s)
{
assert(_str);
assert(s._str);
while(*(_str) == *(s._str))
{
if(_str == ‘\0‘)
return true;
_str++;
s._str++;
}
return false;
}
bool operator>(String &s)
{
assert(_str);
assert(s._str);
while(*(_str) == *(s._str))
{
if(_str == ‘\0‘)
return false;
_str++;
s._str++;
}
return (*_str - *(s._str) > 0 ?true :false);
}
bool operator<(String &s)
{
return !(*this > s || *this == s);
}
public:
/* 自己的 不是很好 */
/********************************
void insert(int pos, char ch)
{
char* str = _str;
int len = strlen(str) + 2;
char* new_p = new char[len];
char* p = new_p;
int i = 0;
for(i = 0; i < pos - 1; i++)
{
*p = *(str);
p++;
str++;
}
*p++ = ch;
for(i = pos; i < len; i++)
{
if(*str == ‘\0‘)
{
break;
}
*p = *(str);
p++;
str++;
}
swap(_str, new_p);
delete[] new_p;
}
************************************/
public:
void insert(int pos, char ch)
{}
private:
char *_str;
};
#endif
//##########################################
/********************************
* 简单实现String类 部分函数
* String& operator=(String str)
* String& operator>(String str)
* String& operator<(String str)
* void insert(int pos, char* str)
* void insert(int pos, const String& str)
* void PushBack(int ch)
* void insert(int pos, char ch)
********************************/
class String
{
#define MORE_CAPACITY 10
public:
String(char* str = "")
:_str(new char[strlen(str) + MORE_CAPACITY])
,_len(strlen(str))
,_capacity(strlen(str) + MORE_CAPACITY)
{
strcpy(_str, str);
}
String(const String& str)
:_str(NULL)
,_len(str._len)
,_capacity(str._capacity)
{
String tmp(str._str);
swap(_str, tmp._str);
}
String& operator=(String str)
{
_len = str._len;
_capacity = str._capacity;
swap(_str, str._str);
return *this;
}
~String()
{
if(_str != NULL)
{
delete[] _str;
_str = NULL;
}
}
public:
bool operator==(const String& str)
{
if(0 == my_strcmp(str._str))
{
return true;
}
else
{
return false;
}
}
bool operator>(const String& str)
{
if(my_strcmp(str._str) > 0)
{
return true;
}
else
{
return false;
}
}
bool operator<(const String& str)
{
if(my_strcmp(str._str) < 0)
{
return true;
}
else
{
return false;
}
}
public:
void insert(int pos, char ch)
{
check_capacity(2);//2包含‘\0‘
int len = _len;
if(pos >=0 && pos <= _len)
{
while(len >= pos)
{
_str[len + 1] = _str[len];
len--;
}
_str[pos] = ch;
if(pos == _len)
{
_str[_len + 1] = ‘\0‘;
}
_len++;
}
}
void insert(int pos, char* str)
{
assert(str);
int insert_len = strlen(str);
check_capacity(insert_len + 1);//1是‘\0‘的空间
int len = _len;
if(pos >=0 && pos <= _len)//pos = _len 是‘\0‘d的位置
{
while(len >= pos)
{
_str[len + insert_len] = _str[len];
len--;
}
//strcpy(&_str[pos], str);//error:会加入‘\0‘
int i = 0;
for(i = 0; i < insert_len; i++ )
{
_str[i + pos] = str[i];
}
_str[_len + insert_len] = ‘\0‘;
_len += insert_len;
}
}
void insert(int pos, const String& str)
{
insert(pos, str._str);//类中定义方法 可以访问同类对象的私有成员
}
void PushBack(int ch)
{
check_capacity(sizeof(int) + 1);
_str[_len] = (char)ch;
_str[_len + 1] = ‘\0‘;
_len++;
}
private:
int my_strcmp(const char* str2)
{
assert(_str);
assert(str2);
char* str1 = _str;
while(*str1 == *str2)
{
if(‘\0‘ == *str1)
{
return 0;
}
str1++;
str2++;
}
return (*str1 > *str2 ? 1 : -1);
}
private:
void check_capacity(int length)//还需要的长度length 包含\0
{
if(_capacity - _len < length)
{
if(_str != NULL)
{
int new_capacity = length + _len + MORE_CAPACITY;
char* new_str = new char[new_capacity];
strcpy(new_str, _str); 
delete[] _str;
_str = new_str;
_capacity = new_capacity;
}
}
}
private:
char* _str;
int _capacity;//容量
int _len;//长度
};
void test1()//测试 String的构造 复制 赋值函数
{
String str1;
String str2("str2");
String str3(str2);
str1 = str3;
}
void test2()//测试 operator== operator< 以及operaator>
{
String str1("str1"),str2("str2   "),str3(str1);
cout<<(str1 > str2)<<endl;//false
cout<<(str1 < str2)<<endl;//true
cout<<(str1 == str3)<<endl;//true
cout<<(str1 == str2)<<endl;//false
}
void test3()//测试void insert(int pos, char ch)
{
String str1("abcdef"),str2(str1),str3(str1),str4(str1);
str1.insert(0,‘M‘);
str2.insert(6,‘M‘);
str3.insert(2,‘M‘);
str4.insert(-1,‘M‘);
str4.insert(10,‘M‘);
}
void test4()//测试void insert(int pos, char* str) 
{
String str1("abcdef"),str2(str1),str3(str1),str4(str1);
str1.insert(0,"ABCDEF");
str2.insert(6,"ABCDEF");
str3.insert(2,"ABCDEF");
str4.insert(-1,"ABCDEF");
str4.insert(10,"ABCDEF");
}
void test5()
//测试void insert(int pos, const String& str)
//测试 void PushBack(int ch)
{
String str1("abc"),str2("ABC");
str1.insert(0, str2);
str2.PushBack(‘D‘);
}
int main()
{
test5();
getchar();
return 0;
}

本文出自 “爱技术爱生活” 博客,请务必保留此出处http://alick.blog.51cto.com/10786574/1749336

以上是关于C++ 模拟String类 相关的主要内容,如果未能解决你的问题,请参考以下文章

[ C++ ] string类常见接口及其模拟实现

c++模拟实现string类

C++初阶:string类string类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现

从零开始学c++———模拟实现string类(常用接口的实现)

C++初阶第九篇——string类(string类中一些常见接口的用法与介绍+string类的模拟实现)

C++从青铜到王者第八篇:STL之string类的模拟实现