我们可以用一个数组来模拟集合,add运算用以实现集合元素的增加,delete运算用于实现集合元素的删除,find运算用以实现集合元素的查找,但是目前集合元素类型未知,可以是int、char、double等基本数据类型,也可以是String、Time、Student等对象类型,要求采用模板函数实现集合元素的增加、删除和查找功能。
三个模板函数如下:
int addSet(T * myset, T elem,int len)
int deleSet(T * myset, T elem, int len)
int findElem(T * myset, T elem, int len)
其中,addSet向集合中添加一个元素,deleSet从集合中删除一个元素,findElem判断elem是否是集合成员,三个函数分别返回元素插入位置,删除位置和存在位置。
主函数有如下数据成员 :
int intSet[100]
double douSet[100]
String StrSet[100] 分别是int类型、double类型、String的数组集合。
int intLen, douLen, strLen分别是int类型、double类型、String的数组集合的长度
完成上述函数模板和主函数,主函数根据输入的信息,建立初始的空集合,调用三个模板函数分别对intSet、douSet和StrSet执行相应的操作,并输出对应的集合信息。
输入格式:
每一行为一个集合操作,每行的第一个数字为集合元素类型,1为整型元素,2为浮点型元素,3为String类型,第二个数字为集合操作类型,1为插入,2为删除,3为查找,第三个为集合元素,集合元素类型视第一个数字给定的集合元素类型而定。输入0时标志输入结束。
输出格式:
输出当前操作的执行位置(插入位置、删除位置和存在位置)
删除操作时,如果元素X不存在,输出“X is not exist!”。
插入操作时,如果集合已满,输出“Full Set.”若元素已存在,输出“X is already exist!”
查找操作时,如果找不到元素,输出“X is not exist!”。
输入:
1 1 1
1 1 2
1 3 1
1 2 1
1 2 3
1 3 1
2 1 1.1
2 1 2.2
2 1 3.3
2 3 1.1
2 2 2.2
2 2 2.2
3 1 abc
3 1 bcd
3 3 abc
3 2 abc
3 3 abc
0
输出:
0
1
0
0
3 is not exist!
1 is not exist!
0
1
2
0
1
2.2 is not exist!
0
1
0
0
abc is not exist!
遇到的问题主要是template<typename T>
一开始忘记这句话每次用模板前都要写一遍,调了好久。。
#include<bits/stdc++.h>
using namespace std;
template<typename T>//写一遍
int Add(T arr[],T elem,int len)
{
bool flag=true;
int pos;
for(int i=0;i<len;i++){
pos=i;
if(arr[i]==elem){
cout<<elem<<" is already exist!"<<endl;
flag=false;
break;
}
}
if(pos==100)cout<<"Full Set."<<endl;
else if(flag==true){
len++;
arr[len-1]=elem;
cout<<len-1<<endl;
}
return len;//更新长度
}
template<typename T>//写一遍
int Delete(T arr[],T elem,int len)
{
bool flag=false;
int pos;
for(int i=0;i<len;i++){
pos=i;
if(arr[i]==elem){
flag=true;
cout<<pos<<endl;
break;
}
}
if(flag){
len--;
for(int i=pos;i<len;i++){
arr[i]=arr[i+1];
}
}
else cout<<elem<<" is not exist!"<<endl;
return len;//更新长度
}
template<typename T>//写一遍
int Find(T arr[],T elem,int len)
{
bool flag=false;
int pos;
for(int i=0;i<len;i++){
pos=i;
if(arr[i]==elem){
flag=true;
cout<<pos<<endl;
break;
}
}
if(flag==false)cout<<elem<<" is not exist!"<<endl;
return len;//更新长度
}
int intSet[100];
double douSet[100];
string StrSet[100];
int intLen,douLen,strLen;
//写在solve里比较清晰
void solve(int type)
{
int op;
int iint;
double dou;
string str;
if(type==1){//int
cin>>op>>iint;
if(op==1)intLen=Add(intSet,iint,intLen);
if(op==2)intLen=Delete(intSet,iint,intLen);
if(op==3)intLen=Find(intSet,iint,intLen);
}
else if(type==2){//double
cin>>op>>dou;
if(op==1)douLen=Add(douSet,dou,douLen);
if(op==2)douLen=Delete(douSet,dou,douLen);
if(op==3)douLen=Find(douSet,dou,douLen);
}
else{//string
cin>>op>>str;
if(op==1)strLen=Add(StrSet,str,strLen);
if(op==2)strLen=Delete(StrSet,str,strLen);
if(op==3)strLen=Find(StrSet,str,strLen);
}
}
int main()
{
while(1){
int tmp;
cin>>tmp;
if(tmp==0)break;
solve(tmp);
}
return 0;
}