set

set的用法 大部分来自
http://fudq.blog.163.com/blog/static/191350238201321862234298/
集合set是一种容器,包含元素都是唯一的,集合中的元素按一定的顺序排好,具体实现采用了红黑树的平衡二叉树的数据结构。
头文件#include

set的几个常用函数用法:
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true(真)
end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向小于(或等于)某值的第一个元素的迭代器
upper_bound() 返回指向大于某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数

#include <iostream>
#include <set>
using namespace std;
int main()
{
    //定义容器set和迭代器
    set<int> myset;
    set<int>::iterator it,itlow,itup;

    //往容器里插入元素
    for(int i=1;i<=10;i++)
        myset.insert(i*10);
    myset.insert(55);

    //输出容器元素个数
    printf("%d\n",(int) myset.size());
    //11

    //依次输出容器元素
    for(it=myset.begin();it!=myset.end();it++)
        printf("%d ",*it);
    printf("\n");
    //10 20 30 40 50 55 60 70 80 90 100

    //依次输出容器元素并删除
//  while(!myset.empty())
//  {
//      printf("%d ",*myset.begin());
//      myset.erase(myset.begin());
//  }
//  printf("\n");

    //从容器里查找元素70并删除
    it=myset.find(70);
    myset.erase(it);

    //输出容器里20和25的个数
    printf("%d\n",myset.count(20));
    printf("%d\n",myset.count(25));
    //1
    //0

    //找到第一个小于等于30的容器,第一个大于60的容器
    itlow=myset.lower_bound(30);
    itup=myset.upper_bound(60);
    for(it=itlow;it!=itup;it++)
        printf("%d ",*it);
    printf("\n");
    //40 50 55 60

    //找到集合中给定值相等的上下限的两个迭代器
    pair<set<int>::iterator, set<int>::iterator > ret;
    ret=myset.equal_range(30);
    printf("lower bound points to: %d\n",*ret.first);
    printf("upper bound points to: %d\n",*ret.second);
    //lower bound points to: 30
    //upper bound points to: 40

    //清空容器
    myset.clear();
    return 0;
}
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
set<int>s[55];
int Count(int a,int b)
{
    set<int>::iterator i;
    int flag = 0;
    for(i = s[a].begin(); i != s[a].end(); i ++)
    {
         if(s[b].find(*i) != s[b].end())
            flag ++;
    }
    int sum = s[a].size() + s[b].size();
    int cnt = sum - flag;
    //float p = (flag*100)/cnt;
    printf("%.2lf%%\n",flag*1.0/cnt*100);
}
int main()
{
    int n,k,m,a,b;
    scanf("%d",&n);
    for(int i = 1; i <= n; i ++)
    {
        scanf("%d",&m);
        for(int j = 0; j < m; j ++)
        {
            scanf("%d",&a);
            s[i].insert(a);
        }
    }
    scanf("%d",&k);
    for(int i = 0; i < k; i ++)
    {
        scanf("%d %d",&a,&b);
        Count(a,b);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值