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的用法