数据结构-字符串(string)(c++)


#include<iostream>

//string类的基本实现


class String
{
public:

	String(int max = 10);					//默认构造
	
	String(const char* str);				//常量构造
	
	String(const String& str);				//拷贝构造
	
	String(int num, char str);				//字符构造

	void print();							//输出数组

	int size();								//获取大小

	bool empty();							//判断是否为空串

	//重载+=操作符	-- 字符串拼接
	String& operator+=(const String& str);	

	String& operator+=(const char* str);	

	String& operator+=(char str);


	//重载=操作符  -- 字符串赋值
	String& operator=(const String& str);	

	String& operator=(const char* str);		

	String& operator=(char str);		


	//重载[]操作符 -- 取值操作
	char& operator[](int num);

	char& at(int num);

	~String();								//析构

private:

	char* S;								//字符数组

	int len;								//当前长度

	int max;								//最大长度 -- 根据最大长度扩容字符数组可以减少时间开销	-- 这里不做实现了
											//后续都是按当前长度等于最大长度实现的函数
};



String::String(int num)						//默认构造
{ 
	S = new char[num];

	S = { 0 };

	len = 0;
	
	max = num;
}



String::String(const char* str)				//常量初始化
{
	
	char* temp = const_cast<char*>(str);	//const cahr* 转 char*

	int i = 0;

	while (str[i] != '\0'){ i++;}

	S = new char[i + 1];

	for (int j = 0; j < i; j++) { S[j] = temp[j]; }

	S[i] = '\0';

	len = i;

	max = i;
}


String::String(const String& str)				//拷贝构造
{
	S = new char[str.len];

	for (int i = 0; i < str.len; i++) { S[i] = str.S[i];}

	len = str.len;

	max = len;
}


String::String(int num, char str)				//num个字符初始化
{
	S = new char[num + 1];

	for (int i = 0; i < num; i++) { S[i] = str; }

	S[num] = '\0';

	len = num;

	max = num;
}


String& String::operator+=(const String& str)		//拼接对象
{
	char* _temp = new char[len];
	char* temp = new char [str.len];

	int _num = len;
	int num = str.len;
	
	for (int i = 0; i < _num; i++) { _temp[i] = S[i];}
	for (int i = 0; i < num; i++) { temp[i] = str.S[i];}
	
	delete[]S;

	S = new char[num + _num + 1];

	for (int i = 0; i < _num; i++) { S[i] = _temp[i]; }

	for (int i = 0; i < num; i++) { S[i + _num] = temp[i]; }

	S[num + _num] = '\0';

	len = num + _num;

	return *this;
}


String& String::operator+=(const char* str)			//拼接常量串
{
	char* temp = const_cast<char*>(str);

	char* _temp = new char[len];

	for (int j = 0; j < len; j++) { _temp[j] = S[j]; }

	int i = 0;

	while (temp[i] != '\0') { i++; }

	delete []S;

	S = new char[len + i + 1];

	for (int j = 0; j < len; j++) { S[j] = _temp[j]; }

	for (int j = 0; j < i; j++) { S[j + len] = temp[j]; }

	S[len + i] = '\0';

	len += i;

	max = len;

	return *this;
}


String& String::operator+=(char str)				//拼接单个字符
{
	char* temp = new char[len];

	for (int i = 0; i < len; i++) { temp[i] = S[i]; }

	delete[]S;

	S = new char[len + 1];

	for (int i = 0; i < len ; i++) { S[i] = temp[i]; }

	S[len] = str;

	len += 1;

	max = len;

	return *this;
}


String& String::operator=(const String& str)			//重载赋值运算符
{
	char* temp = str.S;

	delete[]S;

	S = new char[str.len];

	for (int i = 0; i < str.len; i++) { S[i] = str.S[i]; }

	len = str.len;
	return *this;
}


String& String::operator=(const char* str)				//常量字符串赋值
{
	char* temp = const_cast<char*>(str);

	int i = 0;

	while (temp[i] != '\0') { i++; }

	S = new char[i + 1];

	for (int j = 0; j < i; j++) { S[j] = temp[j]; }

	len = i;

	max = i;

	return *this;
}


String& String::operator=(char str)					//单个字符赋值
{
	S = new char;

	S[0] = str;

	len = 1;

	max = 1;

	return *this;

}


char& String::operator[](int num) { return S[num]; }		//重载[]运算符

char& String::at(int num) { return S[num]; }				//取值操作

bool String::empty()										//判断字符串是否为空
{
	if (S[0] == '\0') { return true; }

	return false;
}



//获取字符串的长度
int String::size() { return len; }


void String::print()
{
	if (S == nullptr) { return; }

	for (int i = 0; i < len; i++) {std::cout << S[i];}

	std::cout << std::endl;

}

String::~String() { delete[]S; S = nullptr; len = 0; max = 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心若雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值