単純シミュレーションSTLライブラリにおけるstringの実装

2183 ワード

#include<iostream>
#include<assert.h>
#include<malloc.h>
#define CAPACITY 3
using namespace std;

class String
{
public:
	String(char *str="")
		:_str((char*)malloc(strlen(str)+1)),
	     _size(strlen(str))
	{
		strcpy(_str, str);
		_capacity = _size+1;
		cout << " " << endl;
	}
	String(String  const&objstr)
		:_str(NULL),
		_size(objstr._size),
		_capacity(objstr._capacity)
	{
		String tmp(objstr._str);
		swap(_str, tmp._str);
	}
	~String()
	{
		cout << " " << endl;
		if (_str)
		{
			free(_str);
		}
		
	}
	size_t newcapacity(size_t size)
	{
		if (size > _capacity)
		{
			
			_str = (char*)realloc(_str, (size + CAPACITY));
		
		}
		return size + CAPACITY;
	}
	void display()
	{
		cout << _str << endl;
	}
	void Pushback(char str)
	{
		int size = _capacity+1;
		_capacity = newcapacity(size);
		_str[_size] = str;
		_str[_size + 1] = '\0';
		_size = _size + 1;
	}
	int Find(char x)
	{
		if (_str == NULL)
		{
			return -1;
		}
		int i = 0;
		for (; i <= (int)_size; i++)
		{
			if (_str[i] == x)
			{
				return i;
			}
		}
		return -1;
	}
	void insert(char x, size_t pos)
	{
		int size = _size + 1;
		_capacity = newcapacity(size);
		int i = _size;
		for (; i >(int)pos; i--)
		{
			_str[i+1] = _str[i];
		}
		_str[pos+1] = x;
		_size = _size + 1;
	}
	String &operator =(String const &str)
	{
		if (str._str == NULL)
		{
			_str = NULL;
			_size = str._size;
     		return *this;
		}
		_capacity = newcapacity(str._capacity);
		char *str1 = str._str;

		strcpy(_str, str1);
		_size = str._size;
		return *this;
	}
	int &operator>(String const &str)
	{
		int ret = strcmp(_str, str._str);
		return ret;
	}
private:
	char * _str;
	size_t _size;
	size_t _capacity;
};

void Test1()
{
	String str1("abcdef");
	String str2(str1);
	int ret=str2.Find('d');
	str2.insert('x', ret);
	str2.Pushback('a');
	cout << ret << endl;
	str2.display();
}

void Test2()
{
	String s1("abcdef");
	String s2("efghlmn");
	s1 = s2;
	s1.display();
}

int main()
{
	//Test1();
	Test2();
	return 0;
}