利用模板实现vector类,异常处理

本文介绍了一个基于C++的自定义CVector向量类模板的设计与实现过程,该类模板提供了构造、析构、size、push_back和下标访问等功能,并在下标访问越界时能够抛出异常。同时,文章还提供了一个测试程序,用于演示如何使用该类模板完成一个简单的解释器,处理各种命令以操作向量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

参考C++ vector类模板,设计实现自己的CVector向量类模板,完成下列基本功能: 构造、析构、size、push_back和下标访问,在通过下标访问越界时抛出异常。编写测试程序,利用该类模板完成一个解释器,它接受命令,执行相应操作。本题不可使用STL vector,所需内存通过动态分配获得,所需内存扩展不可频繁发生。

输入描述

输入命令有5种 :int 整数 代表开始建立整数向量 (整数为向量初始大小);string 整数 代表开始建立string向量;push对象 代表在向量尾追加对象; put 下标 对象 代表需将对象放入向量下标处;fetch 下标 代表取并打印向量下标处对象;当下标越界时抛出异常并显示invalid index:下标;quit代表本队列处理结束。每个队列以int或string开始,以quit结束;所有命令均小写。

输出描述

每个向量从建立到结束输出占一行; 各输出对象前含一个空格。

样例输入

int 10 push 100 push 200 push 50 push 300 put 0 5 put 1 20 push 400 fetch 1 fetch 12 fetch -1 fetch 20 fetch 11 quit
string 10 push hello push some push apple push box put 1 zhang put 2 yes fetch 2 push hdu fetch 1 fetch 20 fetch 12 quit
样例输出

20 50 invalid index:-1 invalid index:20 200
yes zhang invalid index:20 apple

解决:注意第二个输入的整数并不是初始向量的长度,而是已经被占用的向量的长度,例如一开始输入10,push的数据的下标就是11,已经被占用的向量元素的值可以自己确定,string用“”占用,int用0占用
**注意:catch如果参数是字符串,注意const str和str的区别,如果抛出const str异常catch str是无法捕捉的
代码实现

#include<iostream>
#include<string>
using namespace std;
template<class Elemtype>
class vector
{
	private:
		Elemtype *value;
		int L;
		int count;
	public:
		vector();
		void push_back(Elemtype x);
		Elemtype begin();
		Elemtype end();
		void pop();
		int size();
		Elemtype &operator[](int x);
		~vector();
};
template<class Elemtype>
vector<Elemtype>::vector()
{
	L=20;
	value=new Elemtype[L];
	count=0;
}
template<class Elemtype>
void vector<Elemtype>::push_back(Elemtype x)
{
	if(count>=L)
	{
		Elemtype *t=new Elemtype[L+10];        //改了无数遍的内存扩展,哭辽
		for(int i=0;i<count;i++)
			t[i]=value[i];
		delete[] value;
		value=t;
		L+=10; 
		t=NULL;
	} 
	value[count]=x;
	count++;
}
template<class Elemtype>
void vector<Elemtype>::pop()
{
	count--;
}
template<class Elemtype>
Elemtype vector<Elemtype>::begin()
{
	return value[0];
}
template<class Elemtype>
Elemtype vector<Elemtype>::end()
{
	return value[count-1];
}
template<class Elemtype>
int vector<Elemtype>::size()
{
	return count;
}
template<class Elemtype>
Elemtype &vector<Elemtype>::operator[](int x)
{
	if(x<0||x>=count)
		throw x;
	return value[x];
}
template<class Elemtype>
vector<Elemtype>::~vector()
{
	delete[] value;
	L=0;
	count=0;
}
int main()
{
	string s;
	while(cin>>s)
	{
		if(s=="int")
		{
			vector<int> jojo;
			int number;
			cin>>number;
			for(int i=0;i<number;i++)
			{
				jojo.push_back(0);
			}
			string s1;
			while(cin>>s1&&s1!="quit")
			{
				if(s1=="push")
				{
					int data;
					cin>>data;
					jojo.push_back(data);
					
				}
				else if(s1=="put")
				{
					int data1, data2;
					cin>>data1>>data2;
					jojo[data1]=data2;
				}
				else if(s1=="fetch")
				{
					try
					{
						int data;
						cin>>data;
						 cout<<jojo[data]<<" ";
					}
					catch(int s)
					{
						cout<<"invalid index:"<<s<<" ";
					}
				}
			}
		}
		else if(s=="string")
		{
			vector<string> jojo;
			int number;
			cin>>number;
			for(int i=0;i<number;i++)
			{
				jojo.push_back("");
			}
			string s1;
			while(cin>>s1&&s1!="quit")
			{
				if(s1=="push")
				{
					string data;
					cin>>data;
					jojo.push_back(data);
					
				}
				else if(s1=="put")
				{
					int data1;
					string data2;
					cin>>data1>>data2;
					jojo[data1]=data2;
				}
				else if(s1=="fetch")
				{
					try
					{
						int data;
						cin>>data;
						 cout<<jojo[data]<<" ";
					}
					catch(int x)
					{
						cout<<"invalid index:"<<x<<" ";
					}
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值