C++集合的模板类 交并集

参考了修改了网上的代码

http://blog.csdn.net/yycec/article/details/7361067


#include <iostream>  
#include <string>  
#include <memory.h>  
using namespace std;  
template <class T>
class Set
{  
 int maxsize; //集合的当前最大容量  
 int count;  //集合的当前元素个数  
 T *elem;  
public:  
 Set<T>(int initsize=10); //构造函数,创建一个空集,initsize: 集合的初始容量  
 Set<T>(const Set<T>& s); //拷贝构造函数  
 ~Set(); //析构函数  
 int Add(T a[], int len); //增加一组新元素,返回值为新增加的元素个数  
 int Add(T e); //增加一个新元素,返回值为新增加的元素个数  
 bool Contains(T e) const; //检查当前集合中是否已包含元素 e  
 Set<T> Intersect(Set<T>& s); //求与另一集合的交集  
 Set<T> Union(const Set<T>& s) const; //求与另一集合的并集  
 int GetCount() const; //获取当前集合中的元素个数  
 void Print() const; //打印所有元素  
};//注:const 表示该函数不会对当前对象的数据成员做出修改  
 template<class T>
void Set<T>::Print() const  
{  
    for (int i = 0; i < count; i++)
		cout << elem[i] << " ";  
    cout << endl;  
}  
 template<class T>
Set<T> Set<T>::Union(const Set<T>& s) const  
{  
    Set<T> r(s); //用 s 来初始化新集合  
    r.Add(elem, count); //再添加入当前集合中包含的内容  
    return r;  
}  
  template<class T>
inline int Set<T>::GetCount() const   
{  
    return count;  
}  
template<class T>
Set<T> Set<T>::Intersect(Set<T>& s)
{  
    Set<T> r(s.count + this->count);  
    for (int i = 0; i < s.count; i++)  
    {  
       if (Contains(s.elem[i])) r.Add(s.elem[i]); //两个集合中都有的元素,加入到交集中。  
   }  
    return r;  
}  
template<class T>
Set<T>::Set<T>(const Set<T>& s)  
{  
    maxsize = s.maxsize;  
    count = s.count;  
    elem = new T[maxsize];    //为新元素分配空间  
    memcpy(elem, s.elem, sizeof(T)*count); //复制所有元素  
}  
 template<class T>
Set<T>::~Set<T>()  
{  
    //delete[] elem;  //释放占用空间  
}  
template<class T>
Set<T>::Set<T>(int initsize)  
	:maxsize(initsize), count(0)  
{  
	elem = new T [maxsize];  
	if (!elem) throw "申请集合空间失败!";  
}  
 template<class T>
int Set<T>::Add(T a[], int len)  
{  
    int c = 0; //用于记录新增加的元素个数  
    for (int i = 0; i < len; i++) 
		c+= Add(a[i]);  
    return c;  
}  
   template<class T>
int Set<T>::Add(T e)  
{  
    if (Contains(e)) return 0; //当前集合中已包含了指定元素,不用添加了。  
    if (count == maxsize)   //空间已满,再增加空间  
    {  
        T *tmp = new T[maxsize+10];  
        if (!tmp) return 0; //申请新空间失败,退出  
        memcpy(tmp, elem, count*sizeof(T)); //将原来的内容复制到新空间中  
        maxsize += 10; //最大容量增长10个数据单位  
        delete[] elem; //删除原有空间  
        elem = tmp; //将新空间的地址保存下来  
    }  
    elem[count++] = e; //将新元素存放在数组的最后  
    return 1;  
}  
   template<class T>
bool Set<T>::Contains(T e) const  
{  
    for (int i = 0; i < count; i++)  
        if (elem[i] == e) return true;  
    return false;  
}  


  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值