set集合容器

构造set集合的目的:快速检索

元素的插入和中序遍历:采用insert(),插入规则在默认规则下,按元素值由小到大插入;

如果指定规则函数,按自定义函数插入。

#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;

int main()
{
    set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
    s.insert(8);
    s.insert(1);
    s.insert(6);
    s.insert(12);
    s.insert(8);//重复元素,不会插入
    set<int>::iterator it;//定义前向迭代器
    for(it=s.begin();it!=s.end();it++)//中序遍历集合的所有元素
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    return 0;
}

元素反向遍历:使用反向迭代器reserve_iterator,输出结果正好是集合元素反向排序结果。它需要

用到rbegin()和rend()。

#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;

int main()
{
    set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
    s.insert(8);
    s.insert(1);
    s.insert(6);
    s.insert(12);
    s.insert(8);//重复元素,不会插入
    set<int>::reverse_iterator rit;//定义反向迭代器
    for(rit=s.rbegin();rit!=s.rend();rit++)
    {
        cout<<*rit<<" ";
    }
    cout<<endl;
    return 0;
}

元素删除:

#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;

int main()
{
    set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
    s.insert(8);
    s.insert(1);
    s.insert(6);
    s.insert(12);
    s.insert(8);//重复元素,不会插入
    s.erase(6);//删除键值为6的元素
    set<int>::reverse_iterator rit;//定义反向迭代器
    for(rit=s.rbegin();rit!=s.rend();rit++)
    {
        cout<<*rit<<" ";
    }
    cout<<endl;
    s.clear();//清空集合
    cout<<s.size()<<endl;
    return 0;
}

元素的检索:使用find()对集合进行搜素,如果找到,返回该键值的迭代器位置,否则,返回

集合最后一个元素后面的一个位置(下标),即end()。

#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;

int main()
{
    set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
    s.insert(8);
    s.insert(1);
    s.insert(6);
    s.insert(12);
    s.insert(8);//重复元素,不会插入
    set<int>::iterator it;//定义前向迭代器
    it=s.find(6);//查找键值为6的元素
    if(it!=s.end())
    {
        cout<<*it<<endl;
    }
    else
    cout<<"not find it"<<endl;
    it=s.find(20);
    if(it!=s.end())
    {
        cout<<*it<<endl;
    }
    else
    cout<<"not find it"<<endl;
    it=s.find(30);
    cout<<*it<<endl;
    return 0;
}

自定义比较函数

(1)

#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
struct myComp
{
    bool operator()(const int &a,const int &b)//由大到小
    {
        if(a!=b)
            return a>b;
        else
            return a>b;
    }
};
int main(int argc,char*argv[])
{
    set<int,myComp> s;//定义元素类型为int的集合对象,当前没有任何元素
    s.insert(8);
    s.insert(1);
    s.insert(6);
    s.insert(12);
    s.insert(8);//重复元素,不会插入
    set<int,myComp>::iterator it;//定义前向迭代器
    for(it=s.begin();it!=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    return 0;
}

(2)如果元素是结构体

#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
struct Info
{
    string name;
    float score;
    bool operator <(const Info &a) const
    {
        return a.score<score;//从大到小
    }
};
int main(int argc,char*argv[])
{
    set<Info> s;//定义元素类型为int的集合对象,当前没有任何元素
    Info info;
    info.name="Jack";
    info.score=80.5;
    s.insert(info);
    info.name="Tomi";
    info.score=20.5;
    s.insert(info);
    info.name="Nacy";
    info.score=60.5;
    s.insert(info);
    set<Info>::iterator it;//定义前向迭代器
    for(it=s.begin();it!=s.end();it++)
    {
        cout<<(*it).name<<" : "<<(*it).score<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值