set集合

头文件

#include


详细用法(部分)

set t      ------      定义一个int类型的容器,注意set里的每个元素只会出现1次

t.insert(k)      ------      插入元素k,多次插入同一个元素后面无效

t.count(k)      ------      判断元素k是否在容器内

t.erase(k)      ------      删除元素k,若不存在则删除无效

t.clear()      ------      清空容器

t.size()      ------      返回容器现有元素个数

t.empty()      ------      判断容器是否为空


想遍历set里的元素或进行进一步修改,必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)

set::iterator it      ------      定义正向迭代器

set::reverse_iterator rit;      ------      定义反向迭代器

auto it = t.begin();      ------      因为t.begin()返回正向迭代器,所以it自动被定义为正向迭代器,可适应其他所有 操作

以下需要迭代器的操作:

t.begin()      ------      返回set中第一个元素,类型为正向迭代器

t.rbegin()      ------      返回set中最后一个元素,类型为反向迭代器

t.end()      ------      返回set中最后一个元素,类型为正向迭代器

t.rend()      ------      返回set中第一个元素,类型为反向迭代器


t.find(k)      ------      寻找k,若找到返回对应的迭代器,否则返回end();

t.insert(a, b)      ------      插入指针[a, b)之间的元素,已有元素不会再次插入

t.erase(it)      ------      删除迭代器it对应的元素

t.erase(l, r)      ------      删除迭代器[l, r)之间的元素

lower_bound(k)      ------      返回第一个大于等于k的元素的迭代器

upper_bound(k)      ------      返回第一个大于k的元素的迭代器


下面代码介绍一下
#include
#include
using namespace std;
int main(){
//freopen("pengwen.txt","r",stdin);
//用来加速的,不同时使用cin和scanf.
ios::sync_with_stdio(false);
 
//下面是插入元素 
set s;
int n, k;
cout<<"请输入n:"; 
cin>>n;
getchar();
cout<<"插入数字:"< for(int i=1; i<=n; i++) {
cin>>k;
s.insert(k);//插入 
}

//下面介绍size()
//set集合自动排序,本题中size()用来计算元素个数 
//例如:插入5 2 3 3 2 1 6 共7个数,s.size()将出 5;
//此时set中元素为1 2 3 5 6共5个。 
cout<<"s.size()=" < //下面输出结果
set::iterator iter;
cout<<"set中元素: ";
for(iter=s.begin(); iter!=s.end(); iter++) {
cout<<*iter<<" ";
}
cout<
//下面介绍count()
if( s.count(4))
cout<<"4在set集合中."< //下面介绍find()
iter=s.find(5); 
if( iter!=s.end() )
cout<<*iter<
//下面介绍erator()
s.erase(4);
cout<<"set中元素: ";
for(iter=s.begin(); iter!=s.end(); iter++) {
cout<<*iter<<" ";
}
cout<
return 0;
}


下面是例题:
1.

题目描述

  STL库中有许多非常实用的函数,如sort,set,map,vector,queue等。

  此题为set集合的应用教学,题目如下:

  读入n个数,要求输出出现的不同数字的个数

输入

  第一行读入一个 n ( 0

  第二行读入n个整数k (-2^31 <= k <  2^31 )

输出

  输出一个整数答案

样例输入

5
1 3 1 99999999 3

样例输出

3

码:
#include
#include
using namespace std;
int main()
{
    set<int> s;
    int n;
    int k;
    scanf("%d",&n);
    for(int i=1; i<=n; i++){
        scanf("%d",&k);
        s.insert(k);
    }
    printf("%d\n",s.size());
    return 0;
}

注意用cin会超时

2.

读入n个数,要求按照从小到大的顺序输出出现的不同数字。

输入

  第一行读入一个 n ( 0

  第二行读入n个整数k (-2^31 <= k <  2^31 )

输出

  按从小到大的顺序输出不同的数字

样例输入

5
1 3 1 99999999 3

样例输出

1 3 99999999 

#include
#include
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    long long temp;
    set<long long> s;
    for(int i=0;i
        scanf("%lld",&temp);
        s.insert(temp);
    }
    for(set<long long>::iterator j = s.begin();j!=s.end();++j){
        printf("%lld ",*j);
    }
    printf("\n");
    return 0;
}


3.

运动会又开始了,acm俱乐部的出题组成员因要忙着出题,便向教主申请了请假,教主写下了请假名单。

  某成员想知道自己是否在请假名单中,请通过set集合进行解答,如果有请输出YES,否则输出NO

输入

  第一行 包括整数n(名单人数,可能有重复)和 name (某成员的名字) 

  第二行  请假名单

输出

  输出YES或者NO

样例输入

5 zgc

zgc czh zn wsw zn 

样例输出

YES

提示

set的元素也可以是字符串的哦 ,set同样支持结构体,但需要注意的是C++中的set具有自动排序的功能,那么排序结构体的时候就需要重载结构体的<号规则 


#include
#include
#include
using namespace std;
set vis;
int main(){  
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    string name;
    cin>>n>>name;
    for (int i=1;i<=n;i++){
        string str;
        cin>>str;
        vis.insert(str);
    }
    if (vis.count(name)) cout<<"YES"<;
    else                 cout<<"NO"<;
return 0;
}



这是小小的写。不很懂。





















   
   
   

你可能感兴趣的:(C/C++)