SET使用说明

set,顾名思义,就是数学上的集合——每个元素最多只出现一次,并且set中的元素已经从小到大排好序。
头文件:#include < set > //用bits的童鞋请忽略

常用操作 :

begin()    返回set容器的第一个元素的 地址
end()      返回set容器的最后一个元素 地址
clear()    删除set容器中的所有的元素
empty()     判断set容器是否为空
max_size()   返回set容器可能包含的元素最大个数
size()      返回当前set容器中的元素个数
erase(it) 删除迭代器指针it处元素
insert(a) 插入某个元素

还有两个功能类似的函数:count()和find()

1.count() :用来查找set中某个元素出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
2.find():   用来查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end() 。 (最后一个元素的下一个位置,s为set的变量名)

set的遍历,需要用到迭代器,具体的方法见下面的代码:

##include <iostream>
#include<set>
using namespace std;


int main()
{
    set<int> s;                //创建一个int类型的set

    s.insert(10);                //插入数据
    s.insert(30);
    s.insert(20);
    s.insert(40);                

    //遍历数据,用迭代器遍历数据
    for (set<int>::iterator it = s.begin(); it != s.end(); ++it)    
    {
        cout << *it << endl;
    }
    //这里用到了set中的元素已经从小到大排好序的性质

    return 0;
}

最后,不得不提的就是结构体类型(struct )的set ,使用时必须要重载 ‘<’ 运算符

#include<iostream>
#include<set>
#include<string>
using namespace std;
struct Info
{
    string name;
    double score;
    bool operator < (const Info &a) const // 重载“<”操作符,自定义排序规则
    {
        //按score由大到小排序。如果要由小到大排序,使用“>”即可。
        return a.score < score;
    }
};
int main()
{
    set<Info> s;
    Info info;

    //插入三个元素
    info.name = "Jack";
    info.score = 80;
    s.insert(info);
    info.name = "Tom";
    info.score = 99;
    s.insert(info);
    info.name = "Steaven";
    info.score = 60;
    s.insert(info);

    set<Info>::iterator it;
    for(it = s.begin(); it != s.end(); it++)
        cout << (*it).name << " : " << (*it).score << endl; 
    return 0;
}
/*
运行结果:
Tom : 99
Jack : 80
Steaven : 60
*/

例题:(NOIP2006普及组第一题)
明明的随机数

题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式:
输入有2行,第1行为1个正整数,表示所生成的随机数的个数:
N 第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式:
输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

输入样例:
10
20 40 32 67 40 20 89 300 400 15

输出样例:
8
15 20 32 40 67 89 300 400
附代码:

#include<bits/stdc++.h>
using namespace std;

set<int>s;

int a[105];

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        s.insert(a[i]);
    }
    cout<<s.size()<<endl;
    while(!s.empty())
    {
        cout<<*s.begin()<<" ";
        s.erase(s.begin()); 
    }
    return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值