C++容器 简单Vector实现

1 篇文章 0 订阅
1 篇文章 0 订阅

抽象类

    template<typename T>
	class linearList
	{
	public:
		virtual bool empty() = 0;
		virtual int size() = 0;
		virtual bool erase(const int index) = 0;
		virtual void insert(const int index, T element) = 0;
		virtual void clear() = 0;
	};

实体类

#include"linearList.h"
#include<stdlib.h>
#include<iostream>

#define BASIC_SIZE 16            //基础容器容量

	//=====================================DECLARE=====================================
	template<typename T>
	class vector :public linearList<T>
	{
	private:
		T *List = nullptr;       //数组头指针

		int SIZE = 0;            //存放的元素数量
		int CAPACITY = 0;        //容器尺寸

	private:
		inline bool capacityNotEnough();
		inline bool capacityExcessive();
		inline bool wrongIndex(const int index);

		void increaseCapacity();							   //扩容
		void decreaseCapacity();							   //减容
		void initialization();								   //初始化
	public:
		vector();
		vector(const vector& object);						   //拷贝构造函数
		~vector();

		void push_back(T elelemente);                          //尾部插入元素
		bool pop_back();									   //移除尾部元素
		T front();											   //获取头部元素
		T back();											   //获取尾部元素

		T& operator[](const int index);                        //[]操作符重载
		T& operator=(const T& object);                         //=操作符重载

		template<typename T>
		friend std::ostream& operator<<(std::ostream& os, const vector<T>& object);	//重载输出

		int size() override final;                             //返回元素数量
		int capacity() override final;						   //返回容器大小
		bool empty() override final;                           //是否为空
		bool erase(const int index) override final;            //删除指定位置的元素
		void insert(const int index, T element) override final;//插入元素到指定位置
		void clear() override final;                           //清空
	};

详细实现

//=====================================DEFINE=====================================
	template<typename T>
	inline bool vector<T>::capacityNotEnough()
	{
		return (SIZE >= CAPACITY);
	}

	template<typename T>
	inline bool vector<T>::capacityExcessive()
	{
		return ((CAPACITY > BASIC_SIZE) && (SIZE <= (CAPACITY >> 2)));
	}

	template<typename T>
	inline bool vector<T>::wrongIndex(const int index)
	{
		return (index < 0 || index >= SIZE || index >= CAPACITY);
	}
    //============扩容=============
	template<typename T>
	void DataStructure::vector<T>::increaseCapacity()
	{
		T* newList = new T[CAPACITY << 1];                  //容量翻倍
		std::copy(List, List + SIZE, newList);				//拷贝
		delete[] List;
		List = newList;
		newList = nullptr;
		CAPACITY <<= 1;
	}
    //============减容=============
	template<typename T>
	void vector<T>::decreaseCapacity()
	{
		T* newList = new T[CAPACITY >> 1];					//容量减半
		std::copy(List, List + SIZE, newList);				//拷贝
		delete[] List;
		List = newList;
		newList = nullptr;
		CAPACITY >>= 1;
	}
    //============初始化=============
	template<typename T>
	void vector<T>::initialization()
	{
		List = new T[BASIC_SIZE];
		CAPACITY = BASIC_SIZE;
		SIZE = 0;
	}
    //============构造函数=============
	template<typename T>
	DataStructure::vector<T>::vector()
	{
		initialization();
	}
    //============拷贝构造函数=============
	template<typename T>
	vector<T>::vector(const vector & object)
	{
		this->SIZE = object.SIZE;
		this->CAPACITY = object.CAPACITY;
		this->List = new T[object.CAPACITY];
		std::copy(object.List, object.List + object.SIZE, this->List);
	}
    //============析构函数=============
	template<typename T>
	DataStructure::vector<T>::~vector()
	{
		if (!List)	delete[] List;
	}
    //============尾插=============
	template<typename T>
	void DataStructure::vector<T>::push_back(T elelemente)
	{
		if (capacityNotEnough())	increaseCapacity();

		List[SIZE] = elelemente;
		SIZE++;
	}
    //============去尾=============
	template<typename T>
	bool vector<T>::pop_back()
	{
		if (SIZE > 0)
		{
			SIZE--;
			return true;
		}

		return false;
	}
    //============头元素=============
	template<typename T>
	T vector<T>::front()
	{
		if (SIZE > 0)	return T(List[0]);

		return T();
	}
    //============尾元素=============
	template<typename T>
	T vector<T>::back()
	{
		if (SIZE > 0)	return T(List[SIZE - 1]);

		return T();
	}
    //============是否为空=============
	template<typename T>
	bool DataStructure::vector<T>::empty()
	{
		return (SIZE == 0);
	}
    //============元素数量=============
	template<typename T>
	int DataStructure::vector<T>::size()
	{
		return SIZE;
	}
    //============容量=============
	template<typename T>
	int vector<T>::capacity()
	{
		return CAPACITY;
	}
    //============删除元素=============
	template<typename T>
	bool DataStructure::vector<T>::erase(int index)
	{
		if (wrongIndex(index))	return false;

		std::copy(List + index + 1, List + SIZE, List + index);
		SIZE--;

		if (capacityExcessive())	decreaseCapacity();
		return true;
	}
    //============插入元素=============
	template<typename T>
	void DataStructure::vector<T>::insert(int index, T element)
	{
		if (capacityNotEnough())	increaseCapacity();

		std::copy(List + index, List + SIZE, List + index + 1);
		List[index] = element;
		SIZE++;
	}
    //============清空=============
	template<typename T>
	void vector<T>::clear()
	{
		delete[] List;
		List = nullptr;
		initialization();	
	}
    //============重载[]=============
	template<typename T>
	T & DataStructure::vector<T>::operator[](const int index)
	{
		if (wrongIndex(index))
		{
			this->~vector();
			std::abort();
		}

		return List[index];
	}
    //============重载赋值=============
	template<typename T>
	T & vector<T>::operator=(const T& object)
	{
		if (this != &object)	this = object;

		return *this;
	}

	//=====================================FUNCTION=====================================
    //============重载<<=============
	template<typename T>
	std::ostream & operator<<(std::ostream & os, const vector<T>& object)
	{
		for (int index = 0; index < object.SIZE - 1; index++)
			os << object.List[index] << ",";
	
		os << object.List[object.SIZE - 1];

		return os;
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值