C++使用模板创建动态数组类

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
using namespace std;



template<typename T>
class Array
{
public:
	Array(int capacity) {
		data = new T[capacity];
		size = 0;
		this->capacity = capacity;
	}
	Array() {
		this->capacity = 2;
		data = new T[capacity];
		size = 0;
	}
	T& operator[](int i) {
		return data[i];
	}

	int GetSize() {
		return size;
	}
	//可能有问题
	int GetCapacity() {
		return capacity;
	}
	bool IsEmpty() {
		return size == 0;
	}

	void add(int index, T e) {
		if (size == capacity) {
			cout << "array is full,resize?(YorN)" << endl;
			char tmp;
			cin >> tmp;
			if (tmp == 'Y')
			{
				reSize(this->capacity*2);
			}
			else
			{
				throw "array is full";
			}
		}
		if (index<0 || index>size) {
			throw "add::index<0 || index>size";
		}
		for (int i = size - 1; i >= index; i--) {
			data[i + 1] = data[i];
		}
		data[index] = e;
		size++;
	}


	void AddLast(T e) {
		add(size, e);
	}
	void AddFirst(T e) {
		add(0, e);
	}
	void toString() {
		cout << "Array Size =" << size << ",Capacity=" << capacity << endl;
		for (int i = 0; i < size; i++) {
			cout << *(data + i);
			if (i != size - 1) {
				cout << ",";
			}
		}
	}
	int get(T index) {
		if (index<0 || index>size) {
			throw "get::index<0 || index>size";
		}
		return data[index];
	}
	void set(int index, T e) {
		if (index<0 || index>size) {
			throw "set::index<0 || index>size";
		}
		data[index] = e;
	}
	bool contains(T e) {
		for (int i = 0; i < size; i++) {
			if (data[i] == e) {
				return true;
			}
		}
		return false;
	}
	int find(T e) {
		for (int i = 0; i < size; i++) {
			if (data[i] == e) {
				return i;
			}
		}
		return -1;
	}
	//删除并返回
	T remove(int index) {
		if (index<0 || index>size) {
			throw "remove::index<0 || index>size";
		}
		int ret = data[index];
		for (int i = index + 1; i < size; i++) {
			data[i - 1] = data[i];
		}
		size--;
		data[size] = NULL;
		if (size==capacity/4&& this->capacity / 2!=0)
		{
			reSize(this->capacity / 2);
		}
		return ret;
	}
	T removeFirst() {
		return remove(0);
	}
	T removeLast() {
		return remove(size - 1);
	}

	void removeelement(T e) {
		int index = find(e);
		if (index != -1) {
			remove(index);
		}
	}

	~Array() {
		delete[] data;
	}

private:
	void reSize(int newcapacity) {
		/*
		T* tmp = new T[this->capacity];
		for (int i = 0; i < size; i++) {
		tmp[i] = data[i];
		}
		this->capacity = newcapacity;
		data= new T[newcapacity];
		for (int i = 0; i < size; i++) {
		data[i] = tmp[i];
		}
		delete[] tmp;*/
		T* newdata = new T[newcapacity];
		for (int i = 0; i < size; i++) {
			newdata[i] = data[i];
		}
		data = newdata;
		this->capacity = newcapacity;
	}
protected:

private:
	int size;
	T *data;
	int capacity;
};

class Student
{
public:
	Student() {
		this->name = '\0';
		this->score = 0;
	}
	Student(string Studentname, int Studentscore) {
		this->name = Studentname;
		this->score = Studentscore;
	}
	void toString() {
		cout << "Student(name:" << name << ",Score:" << score << ")" << endl;
	}

private:
	string name;
	int score;
};

int main(void)
{
	Array<int> arr = Array<int>(10);
	for (int i = 0; i < 10; i++) {
		arr.AddLast(i);
	}
	arr.toString();
	cout << endl;
	arr.add(1, 100);
	arr.toString();
	cout << endl;
	arr.AddFirst(-1);
	arr.toString();
	cout << endl;
	arr.remove(2);
	arr.toString();
	cout << endl;
	arr.removeelement(4);
	arr.toString();
	cout << endl;
	arr.removeFirst();
	arr.toString();
	cout << endl;

	cout << "____________________" << endl;
	Array<Student> arr1 = Array<Student>();
	arr1.AddLast(Student("Bob", 66));
	arr1.AddLast(Student("Charlie", 88));
	arr1.AddLast(Student("Charlie6", 868));
	for (int i = 0; i < arr1.GetSize(); i++) {
		arr1[i].toString();
	}

	system("pause");
	return 0;
}

你可能感兴趣的:(C++)