c++ 使用类模板实现动态数组

DynamicArray.hpp

#pragma once

const int EXPAND_MEMORY = 10;

template <typename T>
class DynamicArray 
{
public:
	DynamicArray();
	~DynamicArray();

	void append(const T& value);
	void remove(int index);
	void print();
	int cap() { return capacity; }
	int len() { return length; }
	T& operator[](int index);

private:
	T* pArray;
	int length;
	int capacity;
};


template <typename T>
DynamicArray<T>::DynamicArray()
{
	pArray = new T[EXPAND_MEMORY];
	capacity = EXPAND_MEMORY;
	length = 0;
}

template <typename T>
DynamicArray<T>::~DynamicArray()
{
	delete[] pArray;
	pArray = nullptr;
	capacity = 0;
	length = 0;
}

template <typename T>
void DynamicArray<T>::append(const T& value)
{
	if (length >= capacity)
	{
		T* newArray = new T[EXPAND_MEMORY * 2];
		memcpy(newArray, pArray, capacity * sizeof(T));
		delete[] pArray;

		pArray = newArray;
		capacity *= 2;
	}

	pArray[length] = value;
	length++;
}

template <typename T>
void DynamicArray<T>::remove(int index)
{
	if (index > length)
	{
		return;
	}

	memcpy(&pArray[index - 1], &pArray[index], (length - index) * sizeof(T));
	length--;
}

template <typename T>
void DynamicArray<T>::print()
{
	for (int i = 0; i < length; i++)
	{
		std::cout << pArray[i] << std::endl;
	}
}

template <typename T>
T& DynamicArray<T>::operator[](int index)
{
	return pArray[index];
}

student.h

#pragma once

#include<string>
#include<iostream>
using namespace std;

class Student {
public:
	explicit Student()
	{
		this->name = "";
		this->score = 0;
	}
	explicit Student(string name, int score)
	{
		this->name = name;
		this->score = score;
	}
	friend ostream& operator<<(ostream& output, const Student& stu)
	{
		output << "name=" << stu.name << " score=" << stu.score;
		return output;
	}

private:
	string name;
	int score;
};

main.cpp

#include <iostream>
#include "DynamicArray.hpp"
#include "Student.h"

int main()
{
	DynamicArray<Student>* pArray = new DynamicArray<Student>();
	for (int i = 0; i < 10;i++) {
		pArray->append(Student("Tom", i));
	}

	cout << "capacity=" << pArray->cap() << " length=" << pArray->len() << endl;

	pArray->append(Student("Tom", 100 ));
	pArray->print();

	cout << "capacity=" << pArray->cap() << " length=" << pArray->len() << endl;

	std::cout << (*pArray)[10] << std::endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值