集合的模拟实现(类模板)

我们可以用一个类来模拟集合及集合运算,add运算用以实现集合元素的增加,delete运算用于实现集合元素的删除,find运算用以实现集合元素的查找,但是目前集合元素类型未知,可以是int、char、double等基本数据类型,也可以是String、Time、Student等对象类型,要求采用类模板实现集合及集合运算,包括集合元素的增加、删除和查找的等基本功能。

集合模板类MySet包括数据如下:
T data [ 100 ];//用数组来存放所有的集合元素,最多不超过100个元素
int count;//表示目前集合中有多少个元素

包括成员函数如下:
构造函数若干个
集合运算函数如下:
int addSet( T elem)
int deleSet(T elem)
int findElem(T elem)

其中,addSet向集合中添加一个元素,deleSet从集合中删除一个元素,findElem判断elem是否是集合成员,三个函数分别返回元素插入位置,删除位置和存在位置。

主函数有如下数据成员 :
MySet intSet;
MySet douSet;
MySet strSet; 分别是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!


*********************************************************************************************************

#include<iostream>
using namespace std;
template<class unmtype>
class MySet
{
    unmtype data[100];
    int i;
    public:
        MySet()
        {
            i=0;
        }
        void add(unmtype n);
        void deleted(unmtype n);
        void find(unmtype n);
};
template<class unmtype>
void MySet<unmtype>::add(unmtype n)
{
    int j;
    if(i==99)  cout<<"Full Set."<<endl;
    else
    {
        if(i==0)    
        {
            cout<<"0"<<endl;
            data[i]=n;
            i++;
        }
        else
        {
            for(j=0;j<i;j++)
            {
                if(data[j]==n)
                {
                   cout<<n<<" is already exist!"<<endl;
                   break;
                }
            }
            if(j==i)
            {
               cout<<j<<endl;
               data[j]=n;
               i++;
            }
        }
    }
}
template<class unmtype>
void MySet<unmtype>::deleted(unmtype n)
{
    int j,k;
    if(i==0)
    {
        cout<<n<<" is not exist!"<<endl;
    }
    else
    {
        for(j=0;j<i;j++)
        {
            if(data[j]==n)  break;
        }
        if(j==i)  cout<<n<<" is not exist!"<<endl;
        else
        {
            for(k=j;k<i-1;k++)
            {
                data[k]=data[k+1];
            }
            cout<<j<<endl;
            i--;
        }
    }
}
template<class unmtype>
void MySet<unmtype>::find(unmtype n)
{
    int j;
    if(i==0)   cout<<n<<" is not exist!"<<endl;
    else
    {
        for(j=0;j<i;j++)
        {
            if(data[j]==n)
            {
                cout<<j<<endl;
                break;
            }
        }
        if(j==i)   cout<<n<<" is not exist!"<<endl;
    }
}
int main()
{
    int flag,b;
    MySet<int>a;
    MySet<float>a2;
    MySet<string>a3;
    cin>>flag;
    while(flag!=0)
    {
        switch(flag)
        {
            case 1: {
                       
                       int c;
                       cin>>b>>c;
                       switch(b)
                       {
                         case 1:a.add(c);break;
                         case 2:a.deleted(c);break;
                         case 3:a.find(c);break;
                        }
                       break;
                    }
            case 2:{
                       
                       float c;
                       cin>>b>>c;
                       switch(b)
                       {
                         case 1:a2.add(c);break;
                         case 2:a2.deleted(c);break;
                         case 3:a2.find(c);break;
                        }
                       break;
                    }
            case 3:{
                       
                       string c;
                       cin>>b>>c;
                       switch(b)
                       {
                         case 1:a3.add(c);break;
                         case 2:a3.deleted(c);break;
                         case 3:a3.find(c);break;
                        }
                       break;
                    }
        }
        
        cin>>flag;
    }
    return 0;
}


*******************************************************************************************************8

什么时候我才能记得要及时贴代码==!

说好的每天呢( ̄┰ ̄*)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍一个通用集合类的函数模板设计。这个集合类可以存储任意类型的数据,并支持常见的集合操作,如添加元素、删除元素、查找元素和遍历元素等。 首先,我们需要定义一个类模板,来表示这个通用集合类。这个类模板可以有一个模板参数,用来指定集合中元素的类型。然后,我们需要在这个类模板中定义一些成员函数,来完成常见的集合操作。 下面是一个简单的通用集合类的函数模板设计: ```cpp template<typename T> class Collection { public: // 添加元素 void add(T value); // 删除元素 void remove(T value); // 查找元素 bool contains(T value); // 遍历元素 void forEach(void (*func)(T)); private: std::vector<T> m_data; }; template<typename T> void Collection<T>::add(T value) { m_data.push_back(value); } template<typename T> void Collection<T>::remove(T value) { auto it = std::find(m_data.begin(), m_data.end(), value); if (it != m_data.end()) { m_data.erase(it); } } template<typename T> bool Collection<T>::contains(T value) { return std::find(m_data.begin(), m_data.end(), value) != m_data.end(); } template<typename T> void Collection<T>::forEach(void (*func)(T)) { for (auto& elem : m_data) { func(elem); } } ``` 在这个代码中,我们首先定义了一个类模板 `Collection`,它有一个模板参数 `T`,表示集合中元素的类型。然后,我们在这个类模板中定义了四个成员函数,分别是 `add`、`remove`、`contains` 和 `forEach`。这四个函数分别完成添加元素、删除元素、查找元素和遍历元素的功能。 在 `add` 函数中,我们使用了 `std::vector` 来存储元素,然后使用 `push_back` 函数将新元素添加到集合中。 在 `remove` 函数中,我们使用了 `std::find` 函数来查找要删除的元素,然后使用 `erase` 函数将它从集合中删除。 在 `contains` 函数中,我们使用了 `std::find` 函数来查找指定的元素是否存在于集合中。 在 `forEach` 函数中,我们使用了一个函数指针作为参数,来表示对集合中每个元素要执行的操作。然后,我们使用 `for` 循环遍历集合中的每个元素,并依次调用指定的函数。 这样,我们就完成了一个简单的通用集合类的函数模板设计。您可以根据实际需求,对这个模板进行扩展和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值