NEFU set及迭代器

基本知识

set 翻译为集合,是一个内部自动有序且不含重复元素的容器。set 最主要的作用就是自动去重并按升序排序,因此遇到需要去重但是又不方便直接开数组的情况。set 中的元素是唯一的,其内部采用“红黑树”实现。

定义方式:set<类型>name;

c++set方法总结:

1、insert…插入一个元素,插入相同的元素的无效的
2、erase…删除某个元素

第一种删除
s.erase(s.begin());
第二种删除
first = s.begin();
second = s.begin();
second++; second++;
s.erase(first,second);
第三种删除
s.erase(18);

3、count…判断是否再set中
4、clear…清空set
5、size…获取元素的个数

lower_bound(key_value) ,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回第一个大于key_value的定位器

迭代器的使用

set只能通过迭代器访问。即先定义一个迭代器:
set<类型>::iterator it;然后使用“*it”来访问set中的元素。

for(it = s.begin() ; it != s.end() ; it++)
{ 
     cout<<*it<<" ";
}

对于一个set map等等:下标最末尾是rend,末尾后一个是end

例题

明明的随机数-set

#include <bits/stdc++.h>
using namespace std;
set<int>vis;
int main()
{
    int n;
    while(cin>>n)
    {
        vis.clear();
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            vis.insert(x);
        }
        int res;
        res=vis.size();
        cout<<res<<endl;
        set<int>::iterator it;
        for(it=vis.begin();it!=vis.end();it++)
        {
            if(it==vis.begin())
                cout<<*it;
            else
                cout<<" "<<*it;
        }
        cout<<endl;
    }
    return 0;
}

第K小整数-SET

#include <bits/stdc++.h>
using namespace std;
set<int>vis;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0; i<n; i++)
    {
        int x;
        cin>>x;
        vis.insert(x);
    }
    int t=0;
    int f=0;
    set<int>::iterator it;
    for(it=vis.begin(); it!=vis.end(); it++)
    {
        t++;
        if(t==k)
        {
            cout<<*it<<endl;
            f=1;
            break;
        }
    }
    if(f==0)
        cout<<"NO RESULT";
    return 0;
}

单词记忆-set-map

#include <bits/stdc++.h>
using namespace std;
set<string>vis;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        string y;
        cin>>x>>y;
        if(x==0)
            vis.insert(y);
        if(x==1)
        {
            if(vis.count(y)==1)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}

列车调度-SET

#include <bits/stdc++.h>
using namespace std;
set<int>vis;
set<int>::iterator it;//访问set需要迭代器
int res=1;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        if(vis.size()==0)
            vis.insert(x);
        else
        {
            it=vis.upper_bound(x);//it是set容器中第一个大于x的迭代器
            if(it==vis.end())//it>set中所有的数时需要增加一个铁轨
            {
                res++;
                vis.insert(x);
            }
            else
            {
                vis.erase(*it);//x放到去掉的*it的那一根铁轨后面
                vis.insert(x);
            }
        }
    }
    cout<<res<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46126537/article/details/104373388