set【Template】

#include<iostream>
#include<set>
using namespace std;
void test_set()
{
    //四种构造函数形式举例
    set<int> Myset1;
    int Myint2[] = {2,4,6,8,10};
    set<int> Myset2(Myint2,Myint2 + 5);
    set<int> Myset3(Myset2);
    set<int> Myset4(Myset2.begin(),Myset2.end());


    //插入数据
    for (int i=1; i<=5; ++i) //插入1 2 3 4 5 
        Myset1.insert(i);
    int Myint3[] = {3,15,9,6,12};//尽管数组本身,但插入set之后是有序的,且注意对于重复元素(6)是不能重复插入的
    Myset3.insert(Myint3,Myint3+5);

    //查找操作
    set<int>::iterator itr;//迭代器
    itr = Myset1.find(3);//查找2
    if(itr!= Myset1.end())
        cout<<"在Myset1找到元素3!"<<endl;
    else
        cout<<"在Myset1找不到元素3!"<<endl;

    //元素遍历,两种形式
    cout<<"\nMyset1中元素内容如下:"<<endl;
    for(itr = Myset1.begin();itr!=Myset1.end();itr++)
        cout<<*itr<<" ";
    cout<<"\nMyset2中元素内容如下:"<<endl;
    for(itr = Myset2.begin();itr!=Myset2.end();itr++)
        cout<<*itr<<" ";
    cout<<"\nMyset3中元素内容如下:"<<endl;
    for(itr = Myset3.begin();itr!=Myset3.end();itr++)
        cout<<*itr<<" ";
    cout<<"\nMyset4中元素内容如下:"<<endl;
    itr = Myset4.begin();
    while(itr != Myset4.end())
        cout<<*itr ++ << " ";
    //逆向遍历Myset4
    cout<<"\nMyset4逆向遍历结果如下:"<<endl;
    set<int>::reverse_iterator itr2 = Myset4.rbegin();
    while(itr2 != Myset4.rend())
        cout<<*itr2++ << " ";
    cout<<endl;

    //删除操作
    for(int i = 1;i<=5;i++)
        Myset3.erase(i*2);
    cout<<"\nMyset3删除元素之后内容如下:"<<endl;
    for(itr = Myset3.begin();itr!=Myset3.end();itr++)
        cout<<*itr<<" ";
    //或者用itr删除,
    itr = Myset4.begin();
    itr ++;//此时itr指向4
    Myset4.erase(itr);
    cout<<"\nMyset4删除元素之后内容如下:"<<endl;
    for(itr = Myset4.begin();itr!=Myset4.end();itr++)
        cout<<*itr<<" ";
    itr = Myset4.find(6);
    Myset4.erase(itr,Myset4.end());
    cout<<"\nMyset4再次删除元素之后内容如下:"<<endl;
    for(itr = Myset4.begin();itr!=Myset4.end();itr++)
        cout<<*itr<<" ";

    //交换
    Myset1.swap(Myset2);
    cout<<"Myset1与Myset2进行交换"<<endl;
    cout<<"\n交换后Myset1内容如下:"<<endl;
    for(itr = Myset1.begin();itr!=Myset1.end();itr++)
        cout<<*itr<<" ";
    cout<<"\n交换后Myset2内容如下:"<<endl;
    for(itr = Myset2.begin();itr!=Myset2.end();itr++)
        cout<<*itr<<" ";
    cout<<endl;

    //清除与求大小
    cout<<"\nMyset1大小为:"<<Myset1.size()<<endl;
    Myset1.clear();
    cout<<"clear()清除Myset1的所有元素后大小为"<<Myset1.size()<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Set类的实现: ```c++ #include <iostream> #include <algorithm> //用于求并集 using namespace std; template <class T> class Set { private: T* value; //T类型指针,用于存放集合的元素的动态数组,长度为length int size; //集合大小(元素个数) int length; //动态数组长度 public: Set(int len = 50); //构造函数 Set(Set<T>& A); //拷贝构造函数(选做) ~Set(); //析构函数 Set<T>& operator= (Set<T>& r); //重载"="使集合对象可以整体赋值 Set<T> operator+ (Set<T>& r); //重载"+"求两个集合对象的并集 void display(); //输出集合中所有元素 bool isExist(T v); //判断集合中是否包含元素v void add(T v); //向集合中添加一个元素 int getSize(); // 返回集合的大小 int getLength(); // 返回动态数组value的大小 void Resize(int len); // 修改动态数组value的大小 }; template <class T> Set<T>::Set(int len) { size = 0; length = len; value = new T[length]; } template <class T> Set<T>::Set(Set<T>& A) { size = A.size; length = A.length; value = new T[length]; for (int i = 0; i < size; i++) { value[i] = A.value[i]; } } template <class T> Set<T>::~Set() { delete[] value; } template <class T> Set<T>& Set<T>::operator= (Set<T>& r) { if (this == &r) { return *this; } size = r.size; length = r.length; delete[] value; value = new T[length]; for (int i = 0; i < size; i++) { value[i] = r.value[i]; } return *this; } template <class T> Set<T> Set<T>::operator+ (Set<T>& r) { Set<T> res(size + r.size); res.size = size + r.size; int i; for (i = 0; i < size; i++) { res.value[i] = value[i]; } for (int j = 0; j < r.size; j++) { if (!isExist(r.value[j])) { res.value[i++] = r.value[j]; } } return res; } template <class T> void Set<T>::display() { for (int i = 0; i < size; i++) { cout << value[i] << " "; } cout << endl; } template <class T> bool Set<T>::isExist(T v) { for (int i = 0; i < size; i++) { if (value[i] == v) { return true; } } return false; } template <class T> void Set<T>::add(T v) { if (isExist(v)) { return; } if (size == length) { Resize(length * 2); } value[size++] = v; } template <class T> int Set<T>::getSize() { return size; } template <class T> int Set<T>::getLength() { return length; } template <class T> void Set<T>::Resize(int len) { T* temp = new T[len]; int n = min(len, length); for (int i = 0; i < n; i++) { temp[i] = value[i]; } delete[] value; value = temp; length = len; } int main() { Set<int> s1(5); s1.add(1); s1.add(2); s1.add(3); s1.add(4); s1.display(); //1 2 3 4 Set<int> s2(5); s2.add(3); s2.add(4); s2.add(5); s2.add(6); s2.display(); //3 4 5 6 Set<int> s3 = s1 + s2; s3.display(); //1 2 3 4 5 6 return 0; } ``` 在main函数中,我们创建了两个集合s1和s2,并向它们中添加元素。然后,我们调用重载运算符“+”求它们的并集s3,并输出s3中的元素。输出结果如下: ``` 1 2 3 4 3 4 5 6 1 2 3 4 5 6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值