题目描述
参考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<<" ";
}
}
}
}
}
}