string 类的部分实现

版权声明: https://blog.csdn.net/qq_41880190/article/details/84937979

string 类的部分实现

void pushback(char c);尾插

void append(size_t n, char c);尾插 n 个字符 c

string& operator+=(const char* str);追加字符串 str

void resize(size_t newsize, char c = char());修改有效字符个数

void reserve(size_t newcapacity);为字符串预留空间

size_t find(char c, size_t pos = 0) const;返回字符 c 在字符串第一次出现的位置

size_t find(const char* str, size_t pos = 0) const;返回字串在字符串第一次出现的位置

string substr(size_t pos, size_t n);截取从 pos 位置开始的 n 个字符

string& insert(size_t pos, char c); string& insert(size_t pos, const char* str);在 pos 位置插入字符 c 或者字符串 str ,并返回该字符串的位置

string& erase(size_t pos, size_t len);删除 pos 位置上的元素,并返回该元素的下一个位置

string& append(const char* str);在字符串后面追加 str

string& operator+=(const string& str);在字符串后面追加 str

namespace fun
{
	class String
	{
	public:
		String(const char* str = "")
		{
			if (nullptr == str)
			{
				assert(false);
				return;
			}
			_size = strlen(str);
			_capacity = _size;
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		String(const String& s)
			: _str(new char[s._capacity + 1])
			, _size(s._size)
			, _capacity(s._capacity)
		{
			strcpy(_str, s._str);
		}
		String& operator=(const String& s)
		{
			if (this != &s)
			{
				char* pStr = new char[s._capacity + 1];
				strcpy(pStr, s._str);

				delete[] _str;
				_str = pStr;
				_size = s._size;
				_capacity = s._capacity;
			}
			return *this;
		}
		~String()
		{
			if (_str)
			{
				delete[] _str;
				_str = nullptr;
			}
		}
	public:
		void pushback(char c)
		{
			if (_size == _capacity)
				reserve(_capacity * 2);
			_str[_size++] = c;
			_str[_size] = '\0';
		}
		void append(size_t n, char c)
		{
			for (size_t i = 0; i < n; ++i)
			{
				pushback(c);
			}
		}
		void reserve(size_t newcapacity)
		{
			//如果新容量大于旧容量,则开辟新空间
			if (newcapacity > _capacity)
			{
				char* str = new char[newcapacity + 1];
				strcpy(str, _str);//把旧空间内容拷贝至新空间
				//释放旧空间,然后使用新空间
				delete[] _str;
				_str = str;
				_capacity = newcapacity;
			}
		}
		String& operator+=(char c)
		{
			pushback(c);
			return *this;
		}
		String& operator+=(const char* str);//追加字符串
		void resize(size_t newsize, char c = char())
		{
			if (newsize > _size)
			{
				//如果 newsize 大于底层空间大小,则需要开辟空间
				if (newsize > _capacity)
				{
					reserve(newsize);
				}
				memset(_str + _size, c, newsize - _size);
			}
			_size = newsize;
			_str[newsize] = '\0';
		}
	private:
		char* _str;
		size_t _capacity;
		size_t _size;
	};
}

猜你喜欢

转载自blog.csdn.net/qq_41880190/article/details/84937979