C STL之set集合容器

2022-06-28 09:03:11 字數 2578 閱讀 9981

set集合容器

set集合容器實現了紅黑樹(red-black tree)的平衡二叉檢索樹的資料結構, 在 插入元素時, 它會自動調整二叉樹的排列, 把該元素放到適當的位置, 以確保每個子樹根節點的鍵值大於左子樹的所有節點的鍵值, 而小於右子樹所有節點的鍵值; 另外, 還得確保根節點左子樹的高度與右子樹的高度相等, 這樣, 二叉樹的高度最小, 從而檢索速度最快. 要注意的是, 它不會重複插入相同鍵值的元素, 而採取忽略處理.

平衡二叉檢索樹的檢索使用中序遍歷演算法, 檢索效率高於vector, deque和list等容器.另外, 採用中序遍歷演算法可將鍵值由小到大遍歷出來, 所以, 可以理解為平衡二叉檢索樹在插入元素時, 就會自動將元素按鍵值由小到大的順序排列.

對於set容器中的鍵值, 不可直接去修改. 因為如果把容器中的乙個鍵值修改了, set容器會根據新的鍵值旋轉子樹, 以保持新的平衡,這樣, 修改的鍵值很可能就不在原先那個位置上了, 換句話來說, 構造set集合的主要目的就是為了快速檢索

multiset(多重集合容器), map(映照容器)和multimap(多重映照容器)的內部結構也是平衡二叉檢索樹.

使用set前, 需要在程式的標頭檔案中包含宣告"#include"(包含了set和multiset兩種容器的定義)

1.1建立set集合物件

建立set物件時, 需要指定元素的型別, 這一點與其他容器一樣.

#include

using namespace std;

int main()

1.2元素的插入與中序遍歷

採用insert()方法把元素插入到集合中去, 插入的具體規則在預設的比較規則下, 是按元素值由小到大插入, 如果自己指定了比較規則函式, 則按自定義的函式插入

使用前向迭代器對集合中序遍歷, 其結果正好是元素排序的結果

下面這個例子說明了insert()方法的使用方法:

#include

#include

using namespace std;

int main()

cout << endl;

return 0;}/*

1 6 8 12

*/1.3元素的反向遍歷

使用反向迭代器reverse_iterator可以反向遍歷集合, 輸出的結果正好是集合元素的反向排序結果. 它需要用到rbegin()和rend()兩個方法, 他們分別給出了反向遍歷的開始位置和結束位置.

集合進行反向遍歷的例子:

#include

#include

using namespace std;

int main()

cout << endl;

return 0;}/*

12 8 6 1

*/1.4元素的刪除

與插入元素的處理一樣, 集合具有高效的刪除處理功能, 並自動重新調整內部的紅黑樹的平衡.

刪除的物件可以是某個迭代器位置上的元素, 等於某鍵值的元素, 乙個區間上的元素和清空集合

#include

#include

using namespace std;

int main()

cout << endl;

//清空集合

s.clear();

//輸出集合的大小

cout << s.size() << endl;

return 0;}/*

12 8 10*/

1.5元素的檢索

使用find()方法對集合進行檢索, 如果找到查詢的鍵值, 則返回該鍵值的迭代器位置, 否則, 返回集合最後乙個元素後面的乙個位置, 即end().

使用find()方法對集合進行檢索:

#include

#include

using namespace std;

int main()/*6

not found!

*/1.6自定義比較函式

使用insert()將元素插入到集合中去的時候, 集合會根據設定的比較函式將該元素放到該放的結點上去. 在定義集合的時候, 如果沒有指定比較函式, 那麼採用預設的比較函式, 即按鍵值由小到大的順序插入元素. 在很多情況下, 需要自己編寫比較函式.

編寫比較函式有兩種方法

(1)如果元素不是結構體, 那麼, 可以編寫比較函式. 下面這個程式編寫的比較規則是要求按鍵值由大到小的順序將元素插入到集合中:

#include

#include

using namespace std;

//自定義比較函式mycomp, 過載"()"操作符

struct mycomp

};int main()

cout << endl;

return 0;}/*

12 8 6 1

*/(2)如果元素是結構體, 那麼, 可以直接把比較函式寫在結構體內. 例如:

#include

#include

#include

using namespace std;

struct info

};int main()

return 0;}/*

jack : 80.5

nacy : 60.5

tomi : 20.5

*/

C STL之Set集合容器

set集合容器實現了紅黑樹的平衡二叉樹的資料結構,在插入元素時候,它會自動的進行調整二叉樹的排列,把該元素放到適當的位置,以保證每個子樹根節點的鍵值大於左子樹所有的鍵值,小於右子樹所有節點的鍵值 另外,還要確保根節點左子樹的高度與右子樹的高度相等,這樣,二叉樹的高度最小,從而達到檢索的速度最快 注意...

c STL庫容器之集合set

set是stl中一種標準關聯容器,其鍵值就是實值,實值就是鍵值,不可以有重複,所以我們不能通過set的迭代器來改變set的元素的值。它底層使用平衡的搜尋樹 紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可完成,不涉及到記憶體移動和拷貝,所以效率比較高。set,顧名思義是 集合 的意思,在set中元...

C STL學習 Set集合

set int setlnt 乙個存放int的容器 set float setfloat 乙個存放float的容器 set setstring 乙個存放string的容器insert a 在容器中插入元素 begin 返回容器中第乙個資料的迭代器 end 返回容器中最後乙個資料之後的迭代器 rend...