string的模拟实现

#pragma once
#include<iostream>
#include<cstring>
using namespace std;
#include<assert.h>
//不用用free释放一段堆空间两次。因为可能释放完第一次后,操作系统把这块内存分配出去了,立即有释放会导致问题
//创建一个类,编译器会默认生成六个函数
//对空指针的解引用会照成异常。
namespace leb {
#define CAPACITY 5
	class string {
		//传统写法。  还有增删查改
	public:
		//string()   //默认构造
		//	:m_str(new char[1])
		//{
		//	*m_str = '\0';
		//}
		typedef  char * iterator;
		typedef  const char *  const_iterator;

		iterator begin() {
			return m_str;
		}
		const_iterator begin()  const {
			return  m_str;
		}
		iterator end() {
			return m_str + m_size;
		}
		const_iterator end() const {
			return m_str + m_size;
		}

		string(const char * str = "") :m_str(new char[strlen(str) + 1]) {
			//先在堆上开辟空间
			strcpy(m_str, str);   //将数据拷贝到m_str
			m_size = strlen(str);
			m_capacity = m_size + 1;   //实际开辟的大小
		}
		// 深拷贝。  浅拷贝会造成重复释放,有问题。
		string(const string & s) :m_str(new char[s.m_capacity]),
			m_size(s.m_size),
			m_capacity(s.m_capacity)
		{
			strcpy(m_str, s.m_str);
			//不用+1;

		}


		string& operator=(const string & s) {
			if (this != &s) {
				delete[] m_str;
				m_str = new char[s.m_capacity];
				strcpy(m_str, s.m_str);
				m_size = s.m_size;
				m_capacity = s.m_capacity;
			}
			return *this;

		}

		size_t size() {
			return m_size;
		}
		size_t capacity() {
			return m_capacity;
		}

		//返回 C风格字符串。
		const char * c_str() const {
			return m_str;
		}
		//重载[] 运算符。 
		char & operator[](size_t pos) {
			assert(pos < m_size);

			return m_str[pos];
		}
		~string() {
			if (m_str) {
				delete[] m_str;
				m_str = nullptr;
				m_size = m_capacity = 0;
			}

		}

		void resize(size_t size) {
			while (m_size != size) {
				push_back('\0');
			}
		}

		void reserve(size_t n) {

			char * tmp = new char[n];
			strcpy(tmp, m_str);
			delete[] m_str;
			m_str = tmp;
			m_capacity = n;
		}

		void push_back(char ch) {
			if (m_size == m_capacity - 1) {  //去掉最后一个字符
				  //扩容
				reserve((m_capacity) * 2);
			}

			m_str[m_size] = ch;
			m_size++;
			m_str[m_size] = '\0';

		}
		bool empty() {
			if (m_size == 0) {
				return true;
			}
			else {
				return false;
			}
		}
		void pop_back() {
			if (!empty()) {
				m_size--;
			}

		}
		//s1.append("11111");

		void append(const char * str) {
			size_t len = strlen(str);
			if (m_size + len == m_capacity - 1) {
				//扩容
				reserve(m_capacity * 2);
			}
			for (int i = 0; i < len; i++) {
				this->push_back(str[i]);

			}


		}

		const string &	operator+=(char ch) {
			this->push_back(ch);
			return *this;
		}
		string &operator+=(const char * str) {
			append(str);
			return *this;
		}
		//实现find (char ch ,int pos) ;
		size_t find(char ch, int pos = 0) {
			if (pos < 0 || pos >= m_size) {
				return -1;
			}
			//找不为空。
			char*tmp = strchr(m_str + pos, ch);
			if (tmp) {
				return tmp - m_str;
			}
			return -1;
		}
		size_t find(const char * str, int pos = 0) {
			if (pos < 0 || pos >= m_size) {
				return -1;
			}
			const char * tmp = strstr(str + pos, str);
			if (tmp) {
				return tmp - m_str;
			}
			return -1;
		}
		size_t find(const string&s, int pos = 0) {
			if (pos < 0 || pos >= m_size) {
				return -1;
			}
			char * tmp = strstr(m_str + pos, s.c_str());
			if (tmp) {
				return tmp - m_str;
			}
			return -1;
		}
		string substr(size_t pos, size_t num) {
			string tmp;
			tmp.resize(num);
			strncpy(tmp.m_str, m_str + pos, num);
			return tmp;

		}
		bool operator>(const string& s)const {
			int i;
			int minsize = m_size < s.m_size ? m_size : s.m_size;
			for (int i = 0; i < minsize; i++) {
				if (m_str[i] > s.m_str[i])
				{
					return true;
				}
				else if (m_str[i] < s.m_str[i]) {
					return false;
				}
			}
			return  m_size > s.m_size;
		}
		/*bool operator == (const char *str)const {
		
		}*/


		bool operator == (const char * str) const
		{

			int tmp = strncmp(m_str, str, m_size);
			if (!tmp &&  strlen(str) == m_size)
			{
				return true;
			}

			return false;
		}
		friend ostream & operator<<(ostream & s, const string & ss);
		friend istream & operator>>(istream & s,  string & ss);
	private:
		char * m_str;
		size_t m_size;  //大小
		size_t m_capacity;  //容量、
	};
	ostream & operator<<(ostream & s, const string & ss)
	{
		s << ss.m_str << endl;
		return s;
	}
	istream & operator>>(istream & s,  string & ss) {
		char * tmp = new char[1024];
		s.getline(tmp,1024);
		ss.m_size = strlen(tmp); // m_size  大小。
		ss.m_capacity = 1024;
		delete[] ss.m_str;
		ss.m_str = tmp;
		
		return s;

	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值