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