c++ set用法简记

set作为STL中存储数据的一种容器,底层使用红黑树作为内部结构。存入set中的数据具有单一不重复、自动升序,因此可看做一个升序元素的集合。

基本操作如下

set <int> s;
s.insert(x)//向s中插入x元素
s.begin()//返回s中第一个元素的迭代器
s.end()//返回s中最后一个元素的迭代器
s.size()//返回s中元素个数
s.empty()//判断s是否为空
s.find(x)//返回x的迭代器
s.count(x)//返回x出现次数

注意的是end()函数返回的实际是最后一个元素旁边的迭代器,但当直接使用时仍是最后一个元素本身,例如

	int a[5]={
    
    2,1,3,5,4};
    set <int> s;
    for(int i=0;i<5;i++)
        s.insert(a[i]);
    set<int>::iterator it;
    it=s.end();
    cout<<*it<<endl;

输出结果即是 5

但在find(x)函数中,若查询的x元素不存在,迭代器将会返回到end(),此时若不加以判断,则会返回s中的最后一个元素造成错误,因此若使用find()函数可以加上语句

	int x;
    while(cin>>x)
    {
    
    
        it=s.find(x);
        if(it!=s.end())
            cout<<*it<<endl;
        else
            cout<<"no"<<endl;
    }

输出结果如下
在这里插入图片描述

另一方面,若是想判断元素是否在set中存在,也可使用count()函数。由于set容器的特点,每个元素x只会在set中出现一次,因此count(x)的返回值只有0和1,即返回1则元素x存在,返回0则元素x不存在

	int x;
    while(cin>>x)
    {
    
    
        cout<<s.count(x)<<endl;
    }

在这里插入图片描述
贴一道例题

集合相似度 pta

给定两个整数集合,它们的相似度定义为:N​c​​ /N​t ×100%。其中Nc是两个集合都有的不相等整数的个数,N​t
是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤104 ),是集合中元素的个数;然后跟M个[0,10​9​​ ]区间内的整数。

之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:

3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

输出样例:

50.00%
33.33%

解题思路:题意即是判断给定两集合交集和并集的比值,用set就可以很方便的解决,开一个set型数组分别记录集合,遍历查询即可。确实是因为这道题学习了set的用法。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <stdio.h>
#include <cstring>
#include <set>
using namespace std;

int n;
set < int > s[100];

void f(int a,int b)
{
    
    
    int x=0;
    set < int > ::iterator it;
    for(it=s[a].begin();it!=s[a].end();it++){
    
    
        if(s[b].find(*it)!=s[b].end()){
    
    
            x++;
        }
    }
    int sum = s[a].size() + s[b].size();
    double t=(double)x/(sum-x)*100;
    printf("%.2lf%%\n",t);

}

int main()
{
    
    
    int k,a,b,m;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
    
    
        cin >> k;
        while(k--)
        {
    
    
            cin>>a;
            s[i].insert(a);
        }
    }
    cin>>m;
    while(m--)
    {
    
    
        cin>>a>>b;
        f(a,b);
    }


    return 0;
}

拙见至此 欢迎指正

猜你喜欢

转载自blog.csdn.net/ooold_six/article/details/108094451