1. 程式人生 > >STL中set的使用方法

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()還有其它的用處,具體的就在刷題過程中領悟啦。