C++实现向量构造的线性表

#include<iostream>
#include<algorithm>//copy,copy_backward函数
#include<sstream> //ostringstream
#include<string> //字符串
#include<exception>//异常处理
#include<iterator> //ostream_iterator<T>输出流
#include<vector>//vector线性表
using namespace::std;

//异常类
class illegalParameterValue
{
public:
	illegalParameterValue(string theMessage = "Illegal parameter value")
	{
		message = theMessage;
	}
	void outputMessage() { cout << message << endl; }
private:
	string message;
};
class illegalIndex
{
public:
	illegalIndex(string theMessage = "Illegal index") //初始化
	{
		message = theMessage;
	}
	void outputMessage() { cout << message << endl; }
private:
	string message;
};

//向量类
template<typename T>
class vectorList
{
public:
	//构造函数,新加的构造函数,析构函数
	vectorList(int initialCapacity = 10);
	~vectorList() { delete element; }
	//ADT方法
	void erase(int theIndex);
	void insert(int theIndex, const T& theElement);
	void output(ostream& cout);
	typedef typename vector<T>::iterator iterator;   //类的迭代器,很有用
	iterator begin() { return element->begin(); }
	iterator end() { return element->end(); }
	void half();
	void meld(vectorList<T>& a,vectorList<T>& b);
	void merge(vectorList<T>& a, vectorList<T>& b);
	void split(vectorList<T>& a, vectorList<T>& b);
private:
	vector<T>* element;
};
//向量线性表构造函数以及其他函数的定义
template<typename T>
vectorList<T>::vectorList(int initialCapacity)
{
	if (initialCapacity < 1)
	{
		ostringstream s;
		s << "Initial capacity=" << initialCapacity << "Must be >0";
		throw illegalParameterValue(s.str());//s.str(()返回s中储存的string 对象
	}
	element = new vector<T>;
	element->reserve(initialCapacity);
}
//插入函数
template<typename T>
void vectorList<T>::insert(int theIndex, const T& theElement)
{
	element->insert(element->begin()+theIndex, theElement);
}

//删除函数
template<typename T>
void  vectorList<T>::erase(int theIndex)
{
	element->erase(element->begin() + theIndex);
}
//输出函数
template<typename T>
void  vectorList<T>::output(ostream& cout)
{
	copy(element->begin(),element->end(), ostream_iterator<T>(cout, " "));
}
//half函数,删除奇数位的元素
template<typename T>
void vectorList<T>::half()
{
	int n = (element->end() - element->begin()) / 2;
	for (int i= 1; i<=n; i+=1)
	{
		element->erase(element->begin()+i);
	}
}
//合并两个表,值交替进行
template<typename T>
void vectorList<T>::meld(vectorList<T>& a,vectorList<T>& b)
{
	int n = a.end() - a.begin();
	int m = b.end() - b.begin();
	T va;
	if (n<=m)                                    //a比b短,则先按2倍的a进行交替插值,最后把剩余的a值插在末尾
	{
		for (int i = 0; i <2*n; i ++)
		{
			if (i%2 == 0)
				va = (*a.element)[i/2];
			else
				va= (*b.element)[(i-1)/2];
				element->insert(element->begin() + i, va);
		}
		for (int i = 2 * n; i < m + n; i++)
		{
			va = (*b.element)[(i+1)/ 2];
			element->insert(element->begin() + i, va);
		}
	}
	else                                         //a比b长,则操作相反
	{
		for (int i = 0; i <2 * m; i++)
		{
			if (i % 2 == 0)
				va = (*a.element)[i / 2];
			else
				va = (*b.element)[(i - 1) / 2];
			element->insert(element->begin() + i, va);
		}
		for (int i = 2 * m; i < m + n; i++)
		{
			va = (*a.element)[(i + 1) / 2];
			element->insert(element->begin() + i, va);
		}
	}
}
//对两个非递减序列进行合并,保证合并之后是有序的
template<typename T>
void vectorList<T>::merge(vectorList<T>& a, vectorList<T>& b)
{
	int n = a.end() - a.begin();
	int m = b.end() - b.begin();
	int i = 0;
	while(i <n)
	{
		element->insert(element->begin() + i, (*a.element)[i]);
		i++;
	}
	while (i < m + n)
	{
		element->insert(element->begin() + i, (*b.element)[i - n]);
		i++;
	}
	sort(element->begin(),element->end());                    //先合并两个线性表,再用sort函数进行升序排列
}
//分解线性表,生成两个线性表
template<typename T>
void vectorList<T>::split(vectorList<T>& a, vectorList<T>& b)
{
	int n = element->end() - element->begin();
	T va;
	for (int i = 0; i < n; i++)
	{
		va = (*element)[i];
		if (i% 2 == 0)
			a.element->insert(a.element->begin() + i/2, va);
		else
			b.element->insert(b.element->begin() + (i - 1)/ 2, va);
	}
}

int main()
{
	//对向量线性表进行测试
	vectorList<int>y(10);
	y.insert(0, 1);
	y.insert(1, 2);
	y.insert(2, 3);
	y.insert(3, 4);
	//对对半函数测试
	//y.half();
	//y.output(cout);
	vectorList<int>x(10);
	x.insert(0, 0);
	x.insert(1, 1);
	x.insert(2, 0);
	x.insert(3, 1);
	x.insert(4, 8);
	//对合并交替插值函数进行测试
	vectorList<int>z(10);
	//z.meld(y, x);
	//对合并排序函数进行测试
	//z.merge(y, x);
	//z.output(cout);
  //对分割函数测试
	vectorList<int>a(10);
	vectorList<int>b(10);
	y.split(a, b);
	a.output(cout);
	cout << endl;
	b.output(cout);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值