C++set用法

set是什么?

Q:set是什么?

A:set是c++开发者给你提供的一个集合。

Q:set可以进行什么操作?

A:set可以插入,查询,排序,遍历等一些操作。(set自动排序,是一个有序集合)

讲了这些,你应该知道set是什么了吧

头文件:<set>

set声明方法:set<类型> (name)

迭代器:set<类型>::iterator (NAME)

    set<类型>::reverse_iterator (NAME)

下面看一看set的主要操作:

(name).insert()往集合里插入元素

(name).clear()清除集合里所有元素

(name).erase()删除集合元素

(name).find()查询元素是否存在

(name).count()返回某个元素出现了几次

(name).empty()判断元素是否为空

(name).size()查询集合中元素总数

(name).(r)begin()返回第一个指向元素的迭代器

(name).(r)end()返回最后一个指向元素的迭代器

(name).lower_bound()返回第一个大于等于给定值的值的地址

(name).upper_bound()返回第一个大于给定值的值的地址

 

先推荐一道水题洛谷P3370

题目大意:

输入N个字符串,判断有几个不同字符串

 

这就是一道很水的题了,直接看代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
set<string> ss;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        string s;
        cin>>s;
        ss.insert(s);
    }
    printf("%d\n",ss.size());
    return 0;
}

 

我们再进一步,再来看一道题洛谷P2161

这是不是也很水?(会stl与不会的区别

我们维护一个set集合,

然后修改每个的lower_bound(),

最后输出它的元素的多少就OK了。

代码:

#include<set>
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
struct cz
{
    int l,r;
    bool operator <(const cz&rhs)const{return r<rhs.r;}
};
set<cz>s;
int n;
char op;
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        cin>>op;
        if(op=='A')
        {
            set<cz>::iterator it;
            int l,r,ans=0;
            cin>>l>>r;
            it=s.lower_bound((cz){0,l});
            while(it!=s.end() && r>=it->l)
            {
                ++ans;
                s.erase(it);
                it=s.lower_bound((cz){0,l});
            }
            cout<<ans<<endl;
            s.insert((cz){l,r});
        }
        else cout<<s.size()<<endl;
    }
    return 0;
}

 另外,有兴趣的同学可以去看看map的用法

posted @ 2019-03-02 18:56  一个蒟蒻  阅读(3388)  评论(0编辑  收藏  举报
titlechange
TOP