STL中set的使用方法
第一次想認真地學學set,是在我做一題treap的時候產生的念頭。(HNOI2004 寵物收養場,洛谷P2286)
嗯,雖然學過一丟丟的treap和splay,但是這程式設計複雜度貌似有點高……
無奈翻開了題解,發現了一部分神犇是用set來做這題的(甚至只有30+行程式碼)
那麼,我是一個不願意敲太多程式碼的蒟蒻,就左轉了百度百科,查了一波set的用法。
但是,這些用法大全將的東西好深奧呀QAQ,幾乎除了insert操作其它的什麼都不會……
所以,特發拙文普及一波set的用法,也讓大家不再陷入各種玄學資料結構的坑中。
0. 定義一個set容器
- step1:using namespace std;
- step2:直接set<成員型別>成員名
例如:定義一個整型的set容器叫做cc,那麼直接set<int> cc就行了。
1. insert操作
作用:往你定義的set裡面加上一個數。
- step1:定義一個輔助變數tmp;
- step2:輸入tmp;
- step3:將tmp放進你定義的set容器裡面。
例如:往剛定義的cc裡面放一個tmp,那麼直接:cc.insert(tmp)即可。
2. clear操作
作用:清空你的set容器。
- step1:將你的set容器清空。
例如:將剛才定義的cc清空,則為:cc.clear()即可。
3. empty判斷
作用:判斷你的容器是否為空。
- step1:判斷你的容器是否為空。
例如:判斷cc是否為空,只需 if(cc.empty()) 即可,判斷是否非空,只需if (!cc.empty())。
4. size詢問
作用:詢問你的容器裡有多少個元素。
例如:詢問cc的大小,只需 printf("%d\n",cc.size())即可。
特別的,size返回的是非重複元素,而不是所有元素。
例如:
cc裡面有{1 2 3 4 5 6 7 8} 8個元素,那麼他的返回值是8;
cc裡面有{1 1 1 1 1 1 1 1} 8個元素,那麼他的返回值是1;
cc裡面有{1 1 1 2 2 2 2 1} 8個元素,那麼他的返回值是2。
5. begin,end和對set容器的遍歷
這個東西的確有點難……
首先,如果你要對一個set容器進行遍歷的話,你要多開兩個迭代器,然後以這兩個迭代器分別為頭和尾遍歷。
如果你要對cc進行一次遍歷輸出,下面是具體操作步驟:
step1:定義兩個東西:①set<int>::iterator starti = cc.begin();②set<int>::iterator endi = cc.end();
step2:進行一次鬼畜的遍歷:
for (;starti<=endi;starti++) { printf("%d\n",*starti); }
因為begin()和end()返回的都是第一個或者最後一個元素的地址,所以我們在輸出的時候就要加個指標*,表示指向該地址存放的元素。
當然,begin()和end()還有其它的用處,具體的就在刷題過程中領悟啦。