Vector 向量实现

#include <iostream>
using namespace std;
typedef int Rank;
#define Default 5
template <class T>
class Vector
{
private:
	int _size;
	int _capacity;
	T* _elem;
public:
	//构造函数
	Vector(int c = Default, int size = 0, T elem = 0);
	Vector(const T* a, Rank n) { copyfrom(a, 0, n); }
	Vector(const T* a, Rank lo, Rank hi) { copyfrom(a, lo, hi); }
	Vector(const Vector<T>& v) { copyfrom(v._elem, 0, v._size); }
	//各种功能
	inline int size() { return _size; } 
	inline bool is_empty() { return _size == 0; }
	inline bool is_full();
	void expand();//扩容
	void shrink();//缩容
	void insert_s(Rank r, T &t);//在指定的秩插入指定的元素,该函数适用于传间接参数
	void insert(Rank r, T t);//在指定的秩插入指定的元素,该函数适用于传直接参数
	void insert(T &t) { if (_size >= _capacity) return;  _elem[_size] = t; _size++; is_full(); }//在数组末尾插入指定的元素,该函数适用于传直接参数
	void copyfrom(const T* a, Rank lo, Rank hi);//拷贝一个数组中[lo,hi)中的元素到自己的数组中
	int remove(Rank low, Rank hi);//删除[low,hi)元素
	void remove(Rank r) { remove(r, r + 1); }//删除指定秩的元素
	void unsort() { array_rand(_elem, _size); }//数组置乱
	void Bubble_Sort() { BubbleSort(_elem, _size); }//冒泡排序
	void Merge_Sort() { MergeSort(_elem, 0, _size); }//归并排序
	bool is_sorted();   //判断是否已经升序排序
	Rank find_s(T &t,Rank low, Rank hi); //在[low,hi)内寻找为t的元素并返回t所在的Rank,该函数适用于传间接参数
	Rank find(T t, Rank low, Rank hi);  //在[low,hi)内寻找为t的元素并返回t所在的Rank,该函数适用于传直接参数
	Rank find_s(T &t) { return find_s(t, 0, _size); }//在数组内寻找为t的元素并返回t所在的Rank,该函数适用于传间接参数
	Rank find(T t) { return find(t, 0, _size); }//在数组内寻找为t的元素并返回t所在的Rank,该函数适用于传直接参数
	void deduplicate();//删除数组内重复的元素
	void traverse(void(*visit)(T&));//通过函数指针对每个元素做visit操作
	void show();
	//运算符重载
	Vector& operator=(Vector const &v);
	inline T& operator[](Rank r) { return _elem[r]; }
	friend ostream& operator <<(ostream& os, Vector &v);
	//析构函数
	~Vector() { delete[]_elem; }
};
//以下为接口实现
template <class T>
Vector<T>::Vector(int c, int size, T elem) :_capacity(c), _size(size)
{
	_elem = new T[c];
	for (int i = 0; i<size; i++)
		_elem[i] = elem;
}

template <class T>
void Vector<T>::copyfrom(const T* arr, Rank lo, Rank hi)
{
	_size = 0;
	_capacity = (hi - lo) * 2;
	if (_elem)
		delete[]_elem;
	_elem = new T[_capacity];
	for (int i = 0; i < hi-lo; i++)
	{
		_elem[i] = arr[i+lo];
		_size++;
	}
}

template <class T>
bool Vector<T>::is_full()
{
	if (_size == _capacity)
	{
		expand();
		return true;
	}
	else return false;
}

template <class T>
void Vector<T>::expand()
{
	T* oldelem = _elem;
	_elem = new T[_capacity *= 2];
	for (int i = 0; i < _size; i++)
	{
		_elem[i] = oldelem[i];
	}
	delete[] oldelem;
}

template <class T>
void Vector<T>::shrink()
{
	if (_capacity < Default) return;
	if (_size < _capacity / 2)
	{
		T* oldelem = _elem;
		_elem = new T[_capacity /= 2];
		for (int i = 0; i < _size; i++)
			_elem[i] = oldelem[i];
		delete[] oldelem;
	}
}

template <class T>
void Vector<T>::insert_s(Rank r, T &t)
{
	if (r >= _capacity)
	{
		std::cout << "输入的秩大于或等于了容量!\n";
		return;
	}
	if (r > _size && r < _capacity)
	{
		for (int i = _size; i < r; i++)
		{
			_elem[i] = 0; _size++;
		}
		_elem[r] = t; _size++;
		return;
	}
	for (int i = _size; i > r; i--)
		_elem[i] = _elem[i - 1];
	_elem[r] = t;
	_size++;
	is_full();
}

template <class T>
void Vector<T>::insert(Rank r, T t)
{
	if (r >= _capacity)
	{
		std::cout << "输入的秩大于或等于了容量!\n";
		return;
	}
	if (r > _size && r < _capacity)
	{
		for (int i = _size; i < r; i++)
			{ _elem[i] = 0; _size++; }
		_elem[r] = t; _size++;
		return;
	}
	for (int i = _size; i > r; i--)
		_elem[i] = _elem[i - 1];
	_elem[r] = t;
	_size++;
	is_full();
}

template <class T>
int Vector<T>::remove(Rank low, Rank hi)
{
	int move = _size - hi;
	for (int i = 0; i < move; i++)
		_elem[low++] = _elem[hi++];
	_size = low;
	shrink();
	return hi - low;
}

template <class T>
bool Vector<T>::is_sorted()
{
	for (int i = 1; i < _size; i++)
	{
		if (_elem[i - 1] > _elem[i])
			return false;
	}
	return true;
}

template <class T>
Rank Vector<T>::find_s(T &t,Rank low, Rank hi)
{
	if (hi > _size) return -2;
	for (int i = low; i < hi; i++)
	{
		if (_elem[i] == t)
			return i;
	}
	return -1;
}

template <class T>
Rank Vector<T>::find(T t, Rank low, Rank hi)
{
	if (hi > _size) return -2;
	for (int i = low; i < hi; i++)
	{
		if (_elem[i] == t)
			return i;
	}
	return -1;
}

template <class T>
void Vector<T>::deduplicate()
{
	for (int r,i = 0; i < _size; i++)
	{
		while (r=find_s(_elem[i],i+1,_size) > 0)
			remove(r);
	}
}

template <class T>
Vector<T>& Vector<T>::operator=(Vector<T> const &v)
{
	if (_elem)
		delete[] _elem;
	copyfrom(v._elem, 0, v._size);
	return *this;
}

template <class T>
void Vector<T>::show() {
	for (int i = 0; i<_size; i++)
	{
		std::cout << _elem[i] << " ";
	}
}

template <class T>
ostream& operator <<(ostream& os, Vector<T> &v)
{
	for (int i = 0; i < v._size; i++)
		os << v._elem[i] << " ";
	return os;
}

template <class T>
void Vector<T>::traverse(void(*visit)(T&))
{
	for (int i = 0; i < _size; i++)
		(*visit)(_elem[i]);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值