当前位置 博文首页 > Wz_still_shuai的博客:C++——STL-string的模拟实现

    Wz_still_shuai的博客:C++——STL-string的模拟实现

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

    #define _CRT_SECURE_NO_WARNINGS
    //模拟实现一个string类
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    class String {
    private:
    	char* _str;
    	size_t _capacity;
    	size_t _size;	
    public:
    	size_t npos = -1;
    	typedef char* iterator;
    	typedef const char* const_iterator;
    	String() :
    		_size(0),
    		_capacity(0){
    		_str = '\0';
    	}
    
    	String(const String& s) {
    		_size = s._size;
    		_capacity = s._capacity;
    		_str = new char[s._capacity];
    		memcpy(_str, s._str, s._size);
    	}
    
    	//1.reserve
    	void Reserve(size_t n) {
    		size_t newC = (_capacity == 0) ? 15 : _capacity * 2;
    		while (newC < n) {
    			newC *= 2;
    		}
    		_capacity = newC;
    		if (newC == 15) {
    			_str = new char[newC];
    			return;
    		}
    		char* news = new char[newC];
    		strcpy(news, _str);
    		delete[] _str;
    		_str = news;
    	}
    
    	//2.resize
    	void Resize(size_t n, char c = '\0') {
    		if (n < _size) {
    			_size = n;
    			_str[_size] = '\0';
    			return;
    		}
    		if (n > _capacity) {
    			Reserve(n);
    		}
    		for (size_t i = _size; i < n; ++i) {
    			_str[i] = c;
    		}
    		_str[n] = '\0';
    	}
    
    	//3.pushback
    	void PushBack(char c) {
    		if (_size == _capacity) {
    			Reserve(_capacity);
    		}
    		_str[_size] = c;
    		_size++;
    	}
    
    	//4.begin()迭代器
    	iterator begin() {
    		return _str;
    	}
    
    	//5.end()迭代器
    	iterator end() {
    		if (_str) {
    			return _str + _size;
    		}
    		return nullptr;
    	}
    
    	//6.const迭代器
    	const_iterator begin() const {
    		return _str;
    	}
    
    	//7.const end
    	const_iterator end()const {
    		if (_str) {
    			return _str + _size;
    		}
    		return nullptr;
    	}
    
    	//8.+= 的重载
    	//	1)+=一个字符
    	String& operator+=(char c) {
    		if (_size == _capacity) {
    			Reserve(_size);
    		}
    		_str[_size++] = c;
    		_str[_size] = '\0';
    		return *this;
    	}
    
    	//	2)+=一个字符串
    	String& operator+=(const char* c) {
    		size_t len = strlen(c);
    		if (_size + len >= _capacity) {
    			Reserve(_size + len);
    		}
    		strcpy(_str + _size, c);
    		_size += len;
    		_str[_size] = '\0';
    		return *this;
    	}
    
    	//	3)+=一个对象
    	String& operator+=(const String& s) {
    		if (_size + s._size >= _capacity) {
    			Reserve(_size + s._size);
    		}
    		strcpy(_str + _size, s._str);
    		_size += s._size;
    		_str[_size] = '\0';
    		return *this;
    	}
    
    	//9.Insert
    	//	1)在pos位置,插入一个字符
    	String& insert(size_t pos, char c) {
    		if (_size >= _capacity) {
    			Reserve(_size);
    		}
    		_size++;
    		for (size_t i = _size; i > pos; --i) {
    			_str[i] = _str[i - 1];
    		}
    		_str[pos] = c;
    		//_size++;
    		return *this;
    	}
    
    	//	2)在pos位置插入一个字符串
    	String& insert(size_t pos, const char* s) {
    		size_t len = strlen(s);
    		if (_size + len >= _capacity) {
    			Reserve(len + _capacity);
    		}
    		_size += len;
    		for (size_t i = _size - 1; i > pos; --i) {
    			_str[i] = _str[i - len];
    		}
    		strncpy(_str + pos, s, len);
    		return *this;
    	}
    
    	//	3)在pos位置处插入一个对象
    	String& insert(size_t pos, const String& s) {
    		if (_size + s._size >= _capacity) {
    			Reserve(_size + s._size);
    		}
    		_size += s._size;
    		for (size_t i = _size - 1; i > pos; --i) {
    			_str[i] = _str[i - s._size];
    		}
    		strncpy(_str + pos, s._str, s._size);
    		return *this;
    	}
    
    	//10.Erase
    	//	1)在pos位置擦除一个字符
    	void Erase(size_t pos) {
    		if (pos < _size) {
    			while (pos < _size) {
    				_str[pos++] = _str[pos + 1];
    			}
    			_size--;
    		}
    	}
    
    	//	2)在pos位置擦除n个字符
    	void Erase(size_t pos, size_t n) {
    		if (pos < _size) {
    			while (pos < _size) {
    				_str[pos++] = _str[pos + n];
    			}
    			_size -= n;
    		}
    	}
    
    	//11.重载输出运算符 <<
    	friend ostream& operator<<(ostream& _cout, const String& s) {
    		const_iterator it = s.begin();
    		cout << s._size << endl;
    		//cout << s._str[s.end() - 1] << endl;
    		while (it != s.end()) {
    			_cout << *it;
    			++it;
    		}
    		return _cout;
    	}
    
    	//12.find
    	//	1)查找一个字符
    	size_t find(char c) {
    		for (size_t i = 0; i < _size; ++i) {
    			if (_str[i] == c) {
    				return i;
    			}
    		}
    		return npos;
    	}
    
    	//	2)查找一个字符串
    	size_t find(const char* s) {
    		char* pos = strstr(_str, s);
    		if (pos) {
    			return pos - _str;
    		}
    		return npos;
    	}
    
    	//	3)查找一个对象
    	size_t find(const String& s) {
    		char* pos = strstr(_str, s._str);
    		if (pos) {
    			return pos - _str;
    		}
    		return npos;
    	}
    	//14.+的重载
    	//	1)+一个字符
    	String operator+(const char c) {
    		String tmp = *this;
    		tmp += c;
    		return tmp;
    	}
    
    	//	2)+一个字符串
    	String operator+(const char* s) {
    		String tmp = *this;
    		tmp += s;
    		return tmp;
    	}
    
    	//	3)+一个对象
    	String operator+(const String& s) {
    		String tmp = *this;
    		tmp += s;
    		return tmp;
    	}
    	~String() {
    		if (_str) {
    			delete[] _str;
    			_str = nullptr;
    		}
    	}
    
    	size_t size() {
    		return _size;
    	}
    	void Print() {
    		for (size_t i = 0; i < _size; ++i) {
    			cout << _str[i];
    		}
    	}
    };
    
    void test() {
    	String s;
    	s += "aaaaa";
    	s += "123456789";
    	s.PushBack('Q');
    	s.PushBack('W');
    	
    	s.insert(4, 'e');
    	//s.Print();
    	//cout << s._size << endl;
    	//s.insert(2, "hello");
    	//s.Print();
    	//cout << endl;
    	//String s1;
    	//s1 += "ABCDEFG";
    	//s1.insert(2, s);
    	//s1.Print();
    	s.Erase(4);
    	s.Erase(0, 5);
    	cout << s.size() << endl;
    	cout << s << endl;
    	String tmp = s + 'D';
    	cout << tmp.size() << endl;
    	cout << tmp << endl;
    
    	cout << s.find("345") << endl;
    	String s1;
    	s1 += "QW";
    	cout << s.find(s1) << endl;
    }
    
    
    int main() {
    	test();
    	return 0;
    }

    ?

    cs