set集合容器:實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值;另外,還得保證根節點左子樹的高度與右子樹高度相等。
平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector、deque和list等容器,另外使用中序遍歷可將鍵值按照從小到大遍歷出來。
構造set集合主要目的是為了快速檢索,不可直接去修改鍵值。
set的含義是集合,它是乙個有序的容器,裡面的元素都是排序好的,支援插入,刪除,查詢等操作,就
像乙個集合一樣。所有的操作的都是嚴格在logn時間之內完成,效率非常高。 set和multiset的區別是:set插入的元素不能相同,但是multiset可以相同。
建立 multisetbase;
刪除:如果刪除元素a,那麼在定義的比較關係下和a相等的所有元素都會被刪除
base.count( a ):set能返回0或者1,multiset是有多少個返回多少個.
set和multiset都是引用標頭檔案,複雜度都是logn
常用操作:
1.元素插入:insert()
2.中序遍歷:類似vector遍歷(用迭代器)
3.反向遍歷:利用反向迭代器reverse_iterator。
例:sets;
......
set::reverse_iterator rit;
for(rit=s.rbegin();rit!=s.rend();rit++)
4.元素刪除:與插入一樣,可以高效的刪除,並自動調整使紅黑樹平衡。
sets;
s.erase(2); //刪除鍵值為2的元素
s.clear();
5.元素檢索:find(),若找到,返回該鍵值迭代器的位置,否則,返回最後乙個元素後面乙個位置。
sets;
set::iterator it;
it=s.find(5); //查詢鍵值為5的元素
if(it!=s.end()) //找到
cout<<*it<
else //未找到
cout<<"未找到";
6.自定義比較函式
(1)元素不是結構體:
例://自定義比較函式mycomp,過載「()」操作符
struct mycomp
}sets;
......
set::iterator it;
(2)如果元素是結構體,可以直接將比較函式寫在結構體內。
例:struct info
}sets;
......
set::iterator it; 7.
set的基本操作:
begin()
返回指向第乙個元素的迭代器
clear()
清除所有元素
count()
返回某個值元素的個數
empty()
如果集合為空,返回true
end()
返回指向最後乙個元素的迭代器
equal_range()
返回集合中與給定值相等的上下限的兩個迭代器
erase()
刪除集合中的元素
find()
返回乙個指向被查詢到元素的迭代器
get_allocator()
返回集合的分配器
insert()
在集合中插入元素
lower_bound()
返回指向大於(或等於)某值的第乙個元素的迭代器
key_comp()
返回乙個用於元素間值比較的函式
max_size()
返回集合能容納的元素的最大限值
rbegin()
返回指向集合中最後乙個元素的反向迭代器
rend()
返回指向集合中第乙個元素的反向迭代器
size()
集合中元素的數目
swap()
交換兩個集合變數
upper_bound()
返回大於某個值元素的迭代器
value_comp()
返回乙個用於比較元素間的值的函式
c set和multiset的操作
set和multiset這些黑科技什麼的,能用的話當然是很茲瓷的 啦啦啦 ps 由於博主是蒟蒻,所以只知道那些操作是用來幹啥用的,並不清楚原理。我只知道這東西是用rbt實現的,然而並不會寫 splay也行蛤 這東西都不會的你還是別看了 include 然後定義就直接 multi set 型別 名稱這...
C Set常用用法
set集合容器 實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值 另外,還得保證根節點左子樹的高度與右子樹高度相等。平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector...
C Set常用用法
set集合容器 實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值 另外,還得保證根節點左子樹的高度與右子樹高度相等。平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector...