vector(栈)的一些常用方法实现

#ifndef MYVECTOR_H
#define MYVECTOR_H

#define SAFE_DELARR(p) {if(p){delete []p;p=nullptr;}}

template<class T>
class myvector
{
public:
	struct iterator
	{
		iterator()
		{
			pData = nullptr;
		}
		iterator(iterator const &other)
		{
			pData = other.pData;
		}
		iterator& operator=(iterator const &other)
		{
			pData = other.pData;
			return *this;
		}
		iterator& operator ++()//前置++
		{
			++pData;
			return *this;
		}
		iterator operator ++(int)//后置++
		{
			iterator ret = *this;
			++pData;
			return ret;
		}
		iterator& operator --()//前置--
		{
			--pData;
			return *this;
		}
		iterator operator --(int)//后置--
		{
			iterator ret = *this;
			--pData;
			return ret;
		}
		T& operator*()
		{
			return *pData;
		}
		bool operator==(iterator const & other)
		{
			return pData == other.pData;
		}
		bool operator!=(iterator const & other)
		{
			return pData != other.pData;
		}
		int operator-(iterator const &other)
		{
			return pData - other.pData;
		}
		iterator operator+(int n)
		{
			iterator ret = *this;
			ret.pData += n;
			return ret;
		}
		iterator operator-(int n)
		{
			iterator ret = *this;
			ret.pData -= n;
			return ret;
		}
		T *pData;
	};
	struct const_iterator
	{
		T const *pData;
		const_iterator()
		{
			pData = nullptr;
		}
		const_iterator(const_iterator const &other)
		{
			pData = other.pData;
		}
		const_iterator(iterator const &other)
		{
			pData = other.pData;
		}
		const_iterator& operator=(const_iterator const &other)
		{
			pData = other.pData;
			return *this;
		}
		const_iterator& operator=(iterator const &other)
		{
			pData = other.pData;
			return *this;
		}
		const_iterator& operator++()
		{
			++pData;
			return *this;
		}
		const_iterator& operator++(int)
		{
			const_iterator ret = *this;
			++pData;
			return ret;
		}
		const_iterator& operator--()
		{
			--pData;
			return *this;
		}
		const_iterator& operator--(int)
		{
			const_iterator ret = *this;
			--pData;
			return ret;
		}
		T const & operator*() const
		{
			return *pData;
		}
		bool operator==(const_iterator const &other)
		{
			return pData == other.pData;
		}
		bool operator!=(const_iterator const &other)
		{
			return pData != other.pData;
		}
		int operator-(const_iterator const &other)
		{
			return pData - other.pData;
		}
		const_iterator operator+(int n)
		{
			const_iterator ret = *this;
			ret.pData += n;
			return ret;
		}
		const_iterator operator-(int n)
		{
			const_iterator ret = *this;
			ret.pData -= n;
			return ret;
		}
	};
	struct reverse_iterator
	{
		T *pData;
		reverse_iterator()
		{
			pData = nullptr;
		}
		reverse_iterator(reverse_iterator const &other)
		{
			pData = other.pData;
		}
		reverse_iterator& operator=(reverse_iterator const &other)
		{
			pData = other.pData;
			return *this;
		}
		reverse_iterator& operator++()
		{
			--pData;
			return *this;
		}
		reverse_iterator& operator++(int)
		{
			reverse_iterator ret = *this;
			--pData;
			return ret;
		}
		reverse_iterator& operator--()
		{
			++pData;
			return *this;
		}
		reverse_iterator& operator--(int)
		{
			reverse_iterator ret = *this;
			++pData;
			return ret;
		}
		T& operator*()
		{
			return *pData;
		}
		bool operator==(reverse_iterator const &other)
		{
			return pData == other.pData;
		}
		bool operator!=(reverse_iterator const &other)
		{
			return pData != other.pData;
		}
		int operator-(reverse_iterator const &other)
		{
			return other.pData - pData;
		}
		reverse_iterator operator+(int n)
		{
			reverse_iterator ret = *this;
			ret.pData -= n;
			return ret;
		}
		reverse_iterator operator-(int n)
		{
			reverse_iterator ret = *this;
			ret.pData += n;
			return ret;
		}
	};
	struct const_reverse_iterator
	{
		T const *pData;
		const_reverse_iterator()
		{
			pData = nullptr;
		}
		const_reverse_iterator(const_reverse_iterator const &other)
		{
			pData = other.pData;
		}
		const_reverse_iterator(reverse_iterator const &other)
		{
			pData = other.pData;
		}
		const_reverse_iterator& operator=(const_reverse_iterator const &other)
		{
			pData = other.pData;
			return *this;
		}
		const_reverse_iterator& operator=(reverse_iterator const &other)
		{
			pData = other.pData;
			return *this;
		}
		const_reverse_iterator& operator++()
		{
			--pData;
			return *this;
		}
		const_reverse_iterator& operator++(int)
		{
			const_reverse_iterator ret = *this;
			--pData;
			return ret;
		}
		const_reverse_iterator& operator--()
		{
			++pData;
			return *this;
		}
		const_reverse_iterator& operator--(int)
		{
			const_reverse_iterator ret = *this;
			++pData;
			return ret;
		}
		T const & operator*() const
		{
			return *pData;
		}
		bool operator==(const_reverse_iterator const &other)
		{
			return pData == other.pData;
		}
		bool operator!=(const_reverse_iterator const &other)
		{
			return pData != other.pData;
		}
		int operator-(const_reverse_iterator const &other)
		{
			return other.pData - pData;
		}
		const_reverse_iterator operator+(int n)
		{
			const_reverse_iterator ret = *this;
			ret.pData -= n;
			return ret;
		}
		const_reverse_iterator operator-(int n)
		{
			const_reverse_iterator ret = *this;
			ret.pData += n;
			return ret;
		}
	};
public:
	myvector()
	{
		m_pData = nullptr;
		m_DataNum = 0;
		m_Capacity = 0;
	}
	myvector(size_t count)
	{
		if (count >0)
		{
			m_pData = new T[count];
			memset(m_pData, 0, sizeof(T)*count);
		}
		else
		{
			m_pData = nullptr;
		}
		m_Capacity = count;
		m_DataNum = count;
	}
	myvector(size_t count, T const &data)
	{
		if (count > 0)
		{
			m_pData = new T[count];
			for (int i = 0; i < count;++i)
			{
				m_pData[i] = data;
			}
		}
		else
		{
			m_pData = nullptr;
		}
		m_Capacity = count;
		m_DataNum = count;
	}
	myvector(myvector const &other)
	{
		if (other.m_DataNum)
		{
			m_pData = new T[other.m_DataNum];
			for (int i = 0; i < other.m_DataNum;++i)
			{
				this->m_pData[i] = other.m_pData[i];
			}
		}
		else
		{
			m_pData = nullptr;
		}
		m_DataNum = other.m_DataNum;
		m_Capacity = other.m_Capacity;

	}
	void assign(size_t count, T const &data)
	{
		SAFE_DELARR(m_pData);
		if (count > 0)
		{
			m_pData = new T[count];
			for (int i = 0; i < count; ++i)
			{
				m_pData[i] = data;
			}
		}
		else
		{
			m_pData = nullptr;
		}
		m_Capacity = count;
		m_DataNum = count;

	}
	template <class Tpt>
	void assign(Tpt first, Tpt last)
	{
		int count = last - first;
		if (count > 0)
		{
			if (count > m_Capacity)
			{
				SAFE_DELARR(m_pData);
				m_pData = new T[count];
				m_Capacity = count;
			}
			Tpt tpt;
			int index = 0;
			for (tpt = first; tpt != last;++tpt)
			{
				m_pData[index++] = *tpt;
			}
			m_DataNum = count;
		}
		else
		{
			m_DataNum = 0;
		}
	}
	T& at(int sit)
	{
		if (sit < 0 || sit >= m_DataNum)
		{
			throw "invaild index";
		}
		return m_pData[sit];
	}
	T const & at(int sit) const
	{
		if (sit < 0 || sit >= m_DataNum)
		{
			throw "invaild index";
		}
		return m_pData[sit];
	}
	iterator begin()
	{
		iterator ret;
		ret.pData = m_pData;
		return ret;
	}
	const_iterator begin() const
	{
		const_iterator cret;
		cret.pData = m_pData;
		return cret;
	}
	iterator end() //指向最后一个有效元素的下一个(无用)
	{
		iterator ret;
		ret.pData = m_pData + m_DataNum;
		return ret;
	}
	const_iterator end() const
	{
		const_iterator cret;
		cret.pData = m_pData + m_DataNum;
		return cret;
	}
	reverse_iterator rbegin()
	{
		reverse_iterator ret;
		ret.pData = m_pData + m_DataNum - 1;
		return ret;
	}
	const_reverse_iterator rbegin() const
	{
		const_reverse_iterator cret;
		cret.pData = m_pData + m_DataNum - 1;
		return cret;
	}
	reverse_iterator rend()
	{
		reverse_iterator ret;
		ret.pData = m_pData - 1;
		return ret;
	}
	const_reverse_iterator rend() const
	{
		const_reverse_iterator cret;
		cret.pData = m_pData - 1;
		return cret;
	}
	iterator erase(iterator where)
	{
		iterator pt;
		for (pt = where; pt != end() - 1;++pt)
		{
			*pt = *(pt + 1);
		}
		--m_DataNum;
		return where;
	}
	iterator erase(iterator first, iterator last)
	{
		int count = last - first;
		if (count > 0)
		{
			for (iterator fpt = first, iterator lpt = last;lpt!=end(); ++fpt, ++lpt)
			{
				*fpt=*lpt;
			}
		}
		else
		{
			if (count < 0)
			{
				throw "invaild index";
			}
		}
	}
	iterator insert(iterator where, T const &data)
	{
		if (m_DataNum >= m_Capacity)
		{
			int sit = where - begin();
			int newsize = m_Capacity + ((m_Capacity / 2) ? (m_Capacity / 2) : 1);
			T *pNewData = new T[newsize];
			if (m_pData)
			{
				for (int i = 0; i < m_DataNum; ++i)
				{
					pNewData[i] = m_pData[i];
				}
				SAFE_DELETE(m_pData);
			}
			m_pData = pNewData;
			pNewData = nullptr;
			m_Capacity = newsize;
			where = begin() + sit;
		}

		for (iterator pt = end(); pt != where; --pt)
		{
			*pt=*(pt - 1);
		}
		*where = data;
		++m_DataNum;
		return where;

	}

	T& back()
	{
		if (m_DataNum <=0)
		{
			throw "invaild index";
		}
		return m_pData[m_DataNum - 1];
	}
	T const & back() const
	{
		if (m_DataNum <= 0)
		{
			throw "invaild index";
		}
		return m_pData[m_DataNum - 1];
	}
	size_t capacity()
	{
		return m_Capacity;
	}
	void Clear()
	{
		m_DataNum = 0;
	}
	bool empty() const
	{
		return m_DataNum <= 0;
	}
	T& front()
	{
		if (m_DataNum <= 0)
		{
			throw "invaild index";
		}
		return m_pData[0];
	}
	T const & front() const
	{
		if (m_DataNum <= 0)
		{
			throw "invaild index";
		}
		return m_pData[0];
	}
	size_t max_size() const
	{
		return 0xffffffff / sizeof(T);
	}
	void pop_back()
	{

		if (m_DataNum <= 0)
		{
			throw "invaild index";
		}
		--m_DataNum;
	}
	void push_back(T const &data)
	{
		if (m_DataNum >=m_Capacity)
		{
			int _newsize = m_Capacity + ((m_Capacity / 2) ? (m_Capacity / 2): 1);
			T * _pNewData = new T[_newsize];
			if (m_pData)
			{
				for (int i = 0; i < m_DataNum; ++i)
				{
					_pNewData[i] = m_pData[i];
				}
				SAFE_DELARR(m_pData);
			}
			m_pData = _pNewData;
			m_Capacity = _newsize;
		}
		m_pData[m_DataNum++]=data;
	}
	void resize(size_t count)
	{
		if (count <= m_DataNum)
		{
			m_DataNum = count;
		}
		else
		{
			if (count > m_DataNum)
			{
				T *pNewData = new T[count];
				if (m_pData)
				{
					for (int i = 0; i < m_DataNum; ++i)
					{
						pNewData[i] = m_pData[i];
					}
					SAFE_DELETE(m_pData);
				}
				m_pData = pNewData;
				pNewData = nullptr;
				m_Capacity = count;
			}
			memset(m_pData + m_DataNum, 0, sizeof(T)*(count - m_DataNum));
			m_DataNum = count;
		}
	}
	void resize(size_t count, T const &data)
	{
		if (count <= m_DataNum)
		{
			m_DataNum = count;
		}
		else
		{
			if (count > m_DataNum)
			{
				T *pNewData = new T[count];
				if (m_pData)
				{
					for (int i = 0; i < m_DataNum; ++i)
					{
						pNewData[i] = m_pData[i];
					}
					SAFE_DELETE(m_pData);
				}
				m_pData = pNewData;
				pNewData = nullptr;
				m_Capacity = count;
			}
			for (int i = m_DataNum; i < count;++i)
			{
				m_pData[i] = data;
			}
			m_DataNum = count;
		}
	}
	void reserve(size_t count)//扩容
	{
		if (count > m_Capacity)
		{
			T *pNewData = new T[count];
			if (m_pData)
			{
				for (int i = 0; i < m_DataNum; ++i)
				{
					pNewData[i] = m_pData[i];
				}
				SAFE_DELETE(m_pData);
			}
			m_pData = pNewData;
			pNewData = nullptr;
			m_Capacity = count;
		}
	}
	size_t size() const
	{
		return m_DataNum;
	}
	void swap(myvector &other)
	{
		int intswap = 0;
		T *pSwap = nullptr;

		pSwap = this->m_pData;
		this->m_pData = other.m_pData;
		other.m_pData = pSwap;

		intswap = this->m_DataNum;
		this->m_DataNum = other.m_DataNum;
		other.m_DataNum = intswap;

		intswap = this->m_Capacity;
		this->m_Capacity = other.m_Capacity;
		other.m_Capacity = intswap;

	}
	T& operator[](int sit)
	{
		if (sit < 0 || sit >=m_DataNum)
		{
			throw "invaild index";
		}
		return m_pData[sit];
	}
	T const & operator[](int sit) const
	{
		if (sit < 0 || sit >= m_DataNum)
		{
			throw "invaild index";
		}
		return m_pData[sit];
	}
	~myvector()
	{
		SAFE_DELARR(m_pData);
		m_DataNum = 0;
		m_Capacity = 0;
	}
protected:
	T *m_pData;
	int m_DataNum;
	int m_Capacity;
};
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值