ACM中好用的SET

2022-09-13 20:33:21 字數 1551 閱讀 2984

1.確定性(集合中的元素必須是確定的) 2.互異性(集合中的元素互不相同。例如:集合a=,則a不能等於1) 3.無序性(集合中的元素沒有先後之分。)

而stl中的集合set ,按照定義保證了元素的確定性,互異性,神奇的是其中的元素卻是有序的

卓越的前輩們在c++裡為我們封裝好了set,只需要在標頭檔案裡

#includeusing namespace std;
就可以方便的使用了。

如何定義乙個set?

set<_type> _name;

_type集合元素的型別 ,除了基本型別也可以是自定義型別。

_name 該集合的名稱

我們以int為例做一下示範

先介紹幾個set常用的函式

.insert(v) //插入乙個元素v

.erase(v) //刪除乙個元素v (可以是元素的值,也可以是迭代器(後面會有介紹))

.empty() //判斷是否為空

.count(v)//判斷 v出現了幾次

#includeusing namespace std;

int main()

set的應用

有了這幾個函式,set就可以做很多事了,其中最常用的就是判斷乙個數是否出現過。

set內部使用紅黑樹實現,也就是平衡的二叉樹查詢樹,其插入刪除查詢的效率是穩定的o(logn)。這個效率是很高的,當然設計合適的hash函式速度更快o(1),但對於一般的問題這個已經足夠了,而且簡單書寫。

下面就以昨天cf第三題為例做下示範

長度為n的珠子鏈, 從左到右位置標號1~n, 每個位置的珠子可能有不同的種類,

規定連續的一段中如果存在兩個珠子種類相同,則稱為好珠子段,問最多有多少好珠子段,並列印段的位置。

方法

直接貪心,遇到兩個相同的珠子,就記錄下來位置。然後將之前的標記清空。

標記方法?  ai 範圍 1≤ ai ≤ 10^9,開那麼大的陣列顯然不行,而且清空也麻煩

直接用set即可! 

#include #include #include #include #include using namespace std;

const int maxn = 100000*4;

int arr[maxn];

int cnt[maxn];

setst;

int main()

}可以看出迭代器的使用和指標類似 , 也是通過解引用運算子 *it來獲取值,也可以通過++ -- 移動。

也可以單個取出元素

set::iterator it = st.begin();

printf("%d\n",*it);

注意這裡的.begin()代表了set中的首元素位置,而.end()代表的是尾元素位置的下乙個位置。

stl中很多容器都是這樣的左閉右開區間,不用去深究。

tips: 對於需要集合中存在重複元素的情況,stl中也封裝的multiset,用法和set幾乎一樣,這裡不再贅述。

Flex中的set啊Flex中的set

flex中的set啊flex中的set 2010年10月17日 flex中的set function就是給屬性賦值的,說起來簡單,但是遇到乙個相關的bug還真暈。其實幾天前就遇到類似問題了,我沒有深究,趕進度嘛。今天晚上alan修乙個bug的時候又遇到了,作為小leader,我就得幫他解惑。正好自己...

Flex中的set啊Flex中的set

flex中的set啊flex中的set 2010年10月17日 flex中的set function就是給屬性賦值的,說起來簡單,但是遇到乙個相關的bug還真暈。其實幾天前就遇到類似問題了,我沒有深究,趕進度嘛。今天晚上alan修乙個bug的時候又遇到了,作為小leader,我就得幫他解惑。正好自己...

ACM學習歷程10 set集合容器

set集合容器,是一種實現了平衡二叉樹的資料結構,容器中的資料不能重複,即每個資料都是唯一的,而且容器中的資料頁數不能直接修改的,因為修改後的資料很可能不在原來的數字上。set容器的主要目的是快速檢索資料元素,減速時採用中序遍歷,可將容器內資料由小到大遍歷處理。需要注意的是,關聯容器的迭代器不支援 ...