当前位置 博文首页 > aixintianshideshouhu的博客:c++:STL-string类的模拟实现

    aixintianshideshouhu的博客:c++:STL-string类的模拟实现

    作者:[db:作者] 时间:2021-08-19 15:45

    #pragma once
    #include<iostream>
    using namespace std;
    #include<assert.h>
    namespace bit
    {
    	class String
    	{
    	public:
    		typedef char* Iterator;
    		Iterator Begin()
    		{
    			return _str;
    		}
    
    		Iterator End()
    		{
    			return _str + _size;
    		}
    
    		String(const char* str = "")
    		{
    			if(str == NULL)
    			{
    				return ;
    			}
    			_size = strlen(str);
    			_capacity = _size;
    			_str = new char[_capacity+1];
    			strcpy(_str, str);
    		}
    
    		String(const String& s)
    			:_str(NULL)
    			,_size(0)
    			,_capacity(0)
    		{
    			_size = s._size;
    			_capacity = s._capacity;
    			_str = new char[_capacity+1];
    			strcpy(_str, s._str);
    		}
    
    		void Swap(String& s)
    		{
    			swap(_str, s._str);
    			swap(_size, s._size);
    			swap(_capacity, s._capacity);
    		}
    		String& operator=(const String& s)
    		{
    			if(this != &s)
    			{
    				String tmp(s);
    				Swap(tmp);
    			}
    			return *this;
    		}
    
    		~String()
    		{
    			if(_str)
    			{
    				delete[] _str;
    				_size = _capacity = 0;
    			}
    		}
    
    		inline size_t Size()const
    		{
    			return _size;
    		}
    
    		inline size_t Capacity()const
    		{
    			return _capacity;
    		}
    
    		inline char* C_str()const
    		{
    			return _str;
    		}
    
    		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 Reserve(size_t n)
    		{
    			if(n >_capacity)
    			{
    				char* tmp = new char[n+1];
    				strcpy(tmp, _str);
    				delete[] _str;
    				_str = tmp;
    				_capacity = n;
    			}
    		}
    		void PushBack(const char ch)
    		{
    			if(_size == _capacity)
    			{
    				size_t newcapacity = _capacity == 0 ? 15 : _capacity*2;
    				Reserve(newcapacity);
    			}
    			_str[_size] = ch;
    			_size++;
    			_str[_size] = '\0';
    		}
    		
    		void Append(const char* str = "")
    		{
    			size_t len = strlen(str);
    			for(size_t i=0; i<len; i++)
    			{
    				PushBack(str[i]);
    			}
    		}
    
    		String& operator+=(const char& ch)
    		{
    			PushBack(ch);
    			return *this;
    		}
    
    		String& operator+=(const char* str)
    		{
    			Append(str);
    			return *this;
    		}
    
    
    		void Resize(size_t newsize, char c = ' ')
    		{
    			if(newsize>_size)
    			{
    				if(newsize>_size)
    				{
    					Reserve(newsize);
    				}
    				memset(_str+_size, c, newsize-_size);
    			}
    			_size = newsize;
    			_str[_size] = '\0';
    
    			
    		}
    		size_t Find(const char c, size_t pos = 0)const
    		{
    			assert(pos < _size);
    			size_t result = 0;
    			for(size_t i=pos; i<_size; i++)
    			{
    				if(_str[i] == c)
    				{
    					result = i;
    					return i;
    				}
    			}
    			return npos;
    		}
    
    		size_t Find(const char* str, size_t pos = 0)const
    		{
    			assert(pos < _size);
    			char* ret = strstr(_str, str);
    			if(ret == NULL)
    			{
    				return npos;
    			}
    			else
    			{
    				return ret-_str;
    			}
    		}
    
    		String Substr(size_t pos, size_t n)
    		{
    			
    			char* tmp = new char[n+1];
    			if(n>_size)
    				n = _size;
    			size_t i = 0;
    			for(i=0; i<n; i++)
    			{
    				tmp[i] = _str[pos+i];
    			}
    			tmp[i] = '\0';
    			String ret(tmp);
    			delete[] tmp;
    			return ret;
    		}
    
    		String& Insert(size_t pos, const char c)
    		{
    		
    			assert(pos<_size);
    			if(_size+1>=_capacity)
    			{
    				size_t newcapacity = _capacity == 0 ? 15 : _capacity*2;
    				Reserve(newcapacity);
    			}
    			size_t end = _size+1;
    			while(end>pos);
    			{
    				_str[end] = _str[end-1];
    				--end;
    			}
    			_str[pos] = c;
    			_size++;
    			return *this;
    		}
    
    		String& Insert(size_t pos, const char* str)
    		{
    			size_t len = strlen(str);
    			assert(pos<_size);
    			if(_size+len>=_capacity)
    			{
    				Reserve(_size+len);
    			}
    			size_t end = _size+1;
    			while(_size>pos)
    			{
    				_str[end+len-1] = _str[end-1];
    				--end;
    			}
    			for(size_t i=0; i<len; i++)
    			{
    				_str[pos+i] = _str[i];
    			}
    			_size += len;
    			return *this;
    		}
    		String& Erase(size_t pos, size_t len = npos)
    		{
    			assert(pos<_size);
    			if(pos+len>=_size)
    			{
    				_size = pos;
    				_str[_size] = '\0';
    			}
    			else
    			{
    				size_t end = pos+len;
    				while(end<=_size)
    				{
    					_str[pos] = _str[end];
    					pos++;
    					_size++;
    				}
    				_size -= len;
    			}
    			return *this;
    		}
    	private:
    		char* _str;
    		size_t _size;
    		size_t _capacity;
    		const static size_t npos = -1;
    	};
    }
    
    
    cs
    下一篇:没有了