集合的模拟实现(函数模板)

我们可以用一个数组来模拟集合,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!

------------------------------------------------------------------------------------------------------

                   参考代码

------------------------------------------------------------------------------------------------------

  1 #include<iostream>
  2 using namespace std;
  3 //实现add函数模版
  4 template<typename classType>
  5 int add(classType set[],classType n,int place)//传人数组和元素
  6 {
  7     int i,flag=0;
  8     for(i=0;i<place;i++)
  9     {
 10         if(set[i]==n)//已经存在的情况
 11         {
 12             cout<<n<<" is already exist!"<<endl;
 13             flag=1;
 14             break;
 15         }
 16     }
 17     if(i==100)   cout<<"Full Set."<<endl;//数组已满的情况
 18     else  if(flag==0)//正常情况
 19     {
 20         place++;
 21         set[i]=n;
 22         cout<<i<<endl;
 23     }
 24     return place;
 25 }
 26 //实现delete
 27 template<typename classType>
 28 int deleted(classType set[],classType n,int place)
 29 {
 30     int i,flag=0,j;
 31     for(i=0;i<place;i++)
 32     {
 33         if(set[i]==n)
 34         {
 35             flag=1;
 36             cout<<i<<endl;
 37             break;
 38         }
 39     }
 40     if(flag)
 41     {
 42         place--;
 43         for(j=i;j<place;j++)
 44         {
 45             set[j]=set[j+1];
 46         }
 47     }
 48     else cout<<n<<" is not exist!"<<endl;
 49     return place;
 50 }
 51 //实现find
 52 template<typename classType>
 53 void find(classType set[],classType n,int place)
 54 {
 55     int i,flag=0;
 56     for(i=0;i<place;i++)
 57     {
 58         if(set[i]==n)
 59         {
 60             cout<<i<<endl;
 61             flag=1;
 62             break;
 63         }
 64     }
 65     if(flag==0)   cout<<n<<" is not exist!"<<endl;
 66 }
 67 int main()
 68 {
 69     //数组模拟集合
 70     int intSet[100];
 71     double douSet[100];
 72     string StrSet[100];
 73     //记录集合长度
 74     int intLen,douLen,StrLen;
 75     //add.find
 76     int classType,workType;
 77     int intPlace=0,douPlace=0,strPlace=0;
 78     cin>>classType;
 79     while(classType!=0)
 80     {
 81         switch(classType)
 82         {
 83             case 1://int
 84                     {
 85                         int helloIn;
 86                         cin>>workType>>helloIn;
 87                         switch(workType)
 88                         {
 89                             //插入
 90                             case 1:intPlace=add(intSet,helloIn,intPlace);break;
 91                             //删除
 92                             case 2:intPlace=deleted(intSet,helloIn,intPlace);break;
 93                             //查找
 94                             case 3:find(intSet,helloIn,intPlace);break;
 95                         }
 96                         break;
 97                     }
 98             case 2://double
 99                     {
100                         double helloDou;
101                         cin>>workType>>helloDou;
102                         switch(workType)
103                         {
104                             //插入
105                             case 1:douPlace=add(douSet,helloDou,douPlace);break;
106                             //删除
107                             case 2:douPlace=deleted(douSet,helloDou,douPlace);break;
108                             //查找
109                             case 3:find(douSet,helloDou,douPlace);break;
110                         }
111                         break;
112                     }
113             case 3://string
114                     {
115                         string helloStr;
116                         cin>>workType>>helloStr;
117                         switch(workType)
118                         {
119                             //插入
120                             case 1:strPlace=add(StrSet,helloStr,strPlace);break;
121                             //删除
122                             case 2:strPlace=deleted(StrSet,helloStr,strPlace);break;
123                             //查找
124                             case 3:find(StrSet,helloStr,strPlace);break;
125                         }
126                         break;
127                     }
128         }
129         cin>>classType;
130     }
131     return 0;
132 }
时间: 2024-12-12 11:15:30

集合的模拟实现(函数模板)的相关文章

C++ Primer 学习笔记_86_模板与泛型编程 --重载与函数模板

模板与泛型编程 --重载与函数模板 引言: 函数模板可以重载:可以定义有相同名字但参数数目或类型不同的多个函数模板,也可以定义与函数模板有相同名字的普通非模板函数. 但是,声明一组重载函数模板不保证可以成功调用它们,重载的函数模板可能会导致二义性. 一.函数匹配与函数模板 如果重载函数中既有普通函数又有函数模板,确定函数调用的步骤如下: 1.为这个函数名建立候选函数集合,包括: a.与被调用函数名字相同的任意普通函数. b.任意函数模板实例化,在其中,模板实参推断发现了与调用中所用函数实参相匹配

C++ Primer 学习笔记_86_模板与泛型编程 -满载与函数模板

模板与泛型编程 --重载与函数模板 引言: 函数模板可以重载:可以定义有相同名字但参数数目或类型不同的多个函数模板,也可以定义与函数模板有相同名字的普通非模板函数. 但是,声明一组重载函数模板不保证可以成功调用它们,重载的函数模板可能会导致二义性. 一.函数匹配与函数模板 如果重载函数中既有普通函数又有函数模板,确定函数调用的步骤如下: 1.为这个函数名建立候选函数集合,包括: a.与被调用函数名字相同的任意普通函数. b.任意函数模板实例化,在其中,模板实参推断发现了与调用中所用函数实参相匹配

第56课 函数模板的概念和意义

1. 发散性问题:C++中的几种交换变量的方法 (1)宏代码块 VS 函数 [编程实验]变量的交换 #include <iostream> #include <string> using namespace std; //宏定义代码块 #define SWAP(t, a, b) do { t c = a; a = b; b = c; }while(0); //定义函数方式 void Swap(int& a, int& b) { int c = a; a = b; b

读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”

智能指针的行为像是指针,但是没有提供加的功能.例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源.STL容器中的迭代器基本上都是智能指针:当然,你不能通过使用“++”来将链表中的指向一个节点的内建指针移到下一个节点上去,但是list::iterator可以这么做. 1. 问题分析——如何实现智能指针的隐式转换 真正的指针能够做好的一件事情是支持隐式转换.派生类指针可以隐式转换为基类指针,指向非const的指针可以隐式转换成为

使用getopt_long来解析参数的小函数模板

getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct option { const char *name; //名称,下面实例中使用的--help,--version int has_arg; //是否有参数,可选0,1,2三个值,就是上面的那三个宏定义 int *flag; //返回值,传入的一个int指针,表示该参数的解析结果,如果是NULL,那么返

模板(三) 函数模板

一.函数模板介绍 函数模板是一个生成函数的公式,可以用来生成针对特定类型的函数版本: 如:求两个具有相同的数据类型的数值中的最大值:普通的一个函数只能使用于某种特定类型,不能适用于其他数据类型,而使用函数模板则可以进行泛型编程, 对于使用该函数模板的各个数据类型在编译时期则会生成相应的适用于该数据类型的函数版本,这样就避免对于每一种数据类型编写相应的函数版本, 可以加快开发速度,减少不必要的重复代码. template<typename T> T Max(const T &lhs, c

C++中函数模板,显式具体化,显式实例化:

函数模板 形如: template<typename T>  //没有分号 void func(T &a,T &b); 称为函数模板,其中,template和typename为关键字,typename可以用class来替代.T(可以用其他的名称)表示一种泛型,既可以表示int型,也可以表示double或其他类型,将它想象成C++里面的数据类型的集合. 也就是说: void func(T &a,T &b)= void func(int &a,int &am

函数模板(四十七)

我们到目前为止,学习了 C++ 这么久.提个小问题:在 C++ 中有几种交换变量的方法呢?通过定义宏代码块和定义函数.下来我们做个实验 #include <iostream> #include <string> using namespace std; #define SWAP(t, a, b)    do                       {                            t c = a;                 a = b;      

C++解析(26):函数模板与类模板

0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复