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容器的主要目的是快速檢索資料元素,減速時採用中序遍歷,可將容器內資料由小到大遍歷處理。需要注意的是,關聯容器的迭代器不支援 ...