C++中string的模拟实现代码(纯代码)

#include <iostream>
#include<assert.h>
#include<string>
//using namespace std;

const int npos = -1;

class string
{
public:


	string(const char* str = "")
		:
		_size(strlen(str))
	{
		_capacity = _size;
		_str = new char[_size + 1];//+1是为了存储\0
		strcpy(_str, str);
	}

	string(const string& obj)
	{
		_str = new char[obj._capacity];
		strcpy(_str, obj._str);
		_size = obj._size;
		_capacity = obj._capacity;
	}

	~string()
	{
		delete[] _str;
		_str = nullptr;
		_capacity = 0;
		_size = 0;
	}

	string& operator =(const string& obj)
	{
		if (_str != nullptr)
		{
			delete[] _str;
		}
		_str = new char[obj._capacity];
		strcpy(_str, obj._str);
		_size = obj._size;
		_capacity = obj._capacity;
	}

	//==================================================================================

	typedef char* iterator;
	typedef const char* const_iterator;

	iterator begin()
	{
		return _str;
	}

	iterator end()
	{
		return _str + _size;
	}

	const_iterator begin() const
	{
		return _str;
	}

	const_iterator end() const
	{
		return _str + _size;
	}


	//====================================================

	void Push_back(const char ch)
	{
		if (_size == _capacity)
		{
			reserve(_capacity == 0 ? 4 : _capacity * 2);
		}
		_str[_size] = ch;
		_size++;
		_str[_size] = '\0';
	}

	string& operator+=(const char ch)
	{
		if (_size == _capacity)
		{
			reserve(_capacity == 0 ? 4 : _capacity * 2);
		}
		_str[_size++] = ch;
		_str[_size] = '\0';
		return *this;
	}

	string& operator +=(const char* str)
	{
		Append(str);
		return *this;
	}

	void Append(const char* str)
	{
		size_t len = strlen(str);
		if (_size + len > _capacity)
		{
			reserve((_size + len) * 2);
		}
		strcpy(_str + _size, str);
		_size += len;
	}


	void Clear()
	{
		delete[] _str;
		_str = nullptr;
		_size = 0;
		_capacity = 0;
	}

	void Swap(string& s)
	{
		char* Temp = this->_str;
		this->_str = s._str;
		s._str = Temp;

		size_t Temp1 = this->_size;
		this->_size = s._size;
		s._size = Temp1;

		Temp1 = this->_capacity;
		this->_capacity = s._capacity;
		s._capacity = Temp1;

	}

	const char* C_str()const
	{
		return _str;
	}

	//===========================================================

	size_t Size()const
	{
		return _size;
	}

	size_t Capasize()const
	{
		return _capacity;
	}

	bool empty()const
	{
		return _size == 0;
	}

	void resize(size_t n, char c = '\0')
	{
		if (n >= _size)
		{
			for (int i = _size; i < n; i++)
			{
				if (_size == _capacity)
				{
					reserve(_capacity == 0 ? 4 : _capacity * 2);
				}
				_str[i] = c;
			}
		}
		_str[n] = '\0';
		_size = n;
	}

	void reserve(size_t New_capacity)
	{
		if (New_capacity > _capacity)
		{
			char* Temp = new char[New_capacity + 1];
			_capacity = New_capacity;
			strcpy(Temp, _str);
			delete[] _str;
			_str = Temp;
		}

	}

	//================================================================

	char& operator [](size_t pos)
	{
		assert(pos < _size);
		return _str[pos];
	}

	const char& operator [](size_t pos)const
	{
		assert(pos < _size);
		return _str[pos];
	}

	//===================================================================

	void Pop_back()
	{
		if (_size == 0 || _capacity == 0)
		{
			return;
		}
		_str[_size - 1] = '\0';
		_size--;
	}




	//====================================================

	bool operator <(const string& s)
	{
		if (strcmp(_str, s._str) < 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	bool operator <=(const string& s)
	{
		return ((*this) < s) || ((*this) == s);
	}


	bool operator >(const string& s)
	{
		if (strcmp(_str, s._str) > 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	bool operator >=(const string& s)
	{
		return ((*this) > s) || ((*this) == s);
	}

	bool operator ==(const string& s)
	{
		return strcmp(_str, s._str) == 0;
	}

	bool operator !=(const string& s)
	{
		return strcmp(_str, s._str) != 0;
	}

	size_t Find(char c, size_t pos = 0) const
	{
		if (pos > _size)
		{
			return npos;
		}
		const_iterator i = begin() + pos;
		while (i != end())
		{
			if (*i == c)
			{
				return pos;
			}
			pos++;
			i++;
		}
		return npos;
	}



	size_t Find(const char* s, size_t pos = 0) const
	{
		if (pos > _size)
		{
			return npos;
		}
		const_iterator it = begin() + pos;
		while (it != end())
		{
			if (*it == s[0])
			{
				size_t Tem = 1;
				for (size_t i = 1; i + pos < _size; i++)
				{
					if (s[i] == '\0')
					{
						return pos;
					}
					else if (s[i] == *(it + Tem))
					{
						Tem++;
						continue;
					}
					else
					{
						break;
					}

				}

			}
			pos++;
			it++;
		}
		return npos;
	}

	string& insert(size_t pos, char c)
	{
		assert(pos > _size);
		if (_size + 1 >= _capacity)
		{
			reserve(_capacity == 0 ? 4 : _capacity * 2);
		}
		for (int i = _size; i > pos; i--)
		{
			_str[i] = _str[i - 1];
		}
		_str[pos] = c;
		_size++;
		return *this;
	}

	string& insert(size_t pos, const char* str)
	{
		assert(pos <= _size);
		size_t len = strlen(str);
		if (_size + len > _capacity)
		{
			reserve((_capacity + len) * 2);
		}
		for (int i = _size; i > pos; i--)
		{
			_str[i + len - 1] = _str[i - 1];
		}
		for (int j = 0; j < len; j++)
		{
			_str[j + pos] = str[j];
		}
		_size += len;
		_str[_size] = '\0';
		return *this;
	}


	void erase(size_t pos, int len = npos)//pos是指删除的位置,len是删除的长度
	{
		assert(pos < _size);
		if (len == npos || pos + len >= _size)//保证不会后续pos和len指向的范围都在有效字符串内
		{
			_str[pos] = '\0';
			_size = pos;
			return;
		}

		for (int i = 0; i < len; i++)
		{
			for (int j = pos; j < _size - i - 1; j++)
			{
				_str[j] = _str[j + 1];

			}
		}
		_str[_size - len] = '\0';
		_size -= len;
	}

	void text(const string& str);



private:
	char* _str;
	size_t _size;
	size_t _capacity;
};







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值