STL之set的用法

2022-08-15 18:39:14 字數 2711 閱讀 5055

1.關於set

首先,set是關聯容器,set作為乙個容器是用來儲存同一種資料型別的資料結構,基本功能與陣列相似。不同的是,在set中每個元素的值都是唯一的。而且系統能夠根據元素的值自動進行排序。但是set中數元素的值並不能直接被改變。

除了set,stl中還有一些標準關聯容器multiset、map和multimap等,這些關聯容器內部均是採用紅黑樹實現的。

set具有以下特性:

(1)map和set的插入刪除效率比其他序列容器高,這是因為:

set中所有元素都是以節點的方式來儲存的,其節點結構和鍊錶類似,指向父節點和子節點。所以,在插入和刪除時不需要做記憶體拷貝和記憶體移動,故而提高了效率。

(2)每次insert之後,以前儲存的iterator不會失效,這是因為:

迭代器iterator在set中就相當於指向節點的指標,只要記憶體不變,那這個iterator就不會失效。相對於vector來說,每一次的刪除和插入之後,指標都有可能失效,呼叫push_back在尾部插入的時候情況也是如此。因為為了保證內部資料的連續存放,iterator指向的那塊記憶體在插入和刪除的過程中可能已經被其他記憶體覆蓋或者記憶體已經被釋放掉了。即使是push_back的時候,容器內部空間可能不夠,需要一塊新的更大的記憶體,只能把以前的記憶體釋放掉,申請更大的記憶體,複製已有的資料元素都新的記憶體中,最後把需要插入的元素放到最後,那麼以前的記憶體指標自然就不可用了。特別是在和find、erase等操作一起使用的時候,一定要注意:不要使用失效的iterator。

vector的記憶體增長和記憶體分配原理見:

(3)當資料元素增多時,set的插入和搜尋速度變化如何?

如果你知道log2的關係你應該就徹底了解這個答案。在set中查詢是使用二分查詢,也就是說,如果有16個元素,最多需要比較4次就能找到結果,有32個元素,最多比較5次。那麼有10000個呢?最多比較的次數為log10000,最多為14次,如果是20000個元素呢?最多不過15次。看見了吧,當資料量增大一倍的時候,搜尋次數只不過多了1次,多了1/14的搜尋時間而已。你明白這個道理後,就可以安心往裡面放入元素了。

2.set的相關操作

2.1.常用方法

begin()        ,返回set容器的第乙個元素

end()      ,返回set容器的最後乙個元素

clear()          ,刪除set容器中的所有的元素

empty()    ,判斷set容器是否為空

max_size()   ,返回set容器可能包含的元素最大個數

size()      ,返回當前set容器中的元素個數

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

此外,還有一些操作也是set常用的:

(1)count()用來查詢set中某個某個鍵值出現的次數。這個函式在set並不是很實用,因為乙個鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了。

(2)equal_range(),返回一對定位器,分別表示第乙個大於或等於給定關鍵值的元素和 第乙個大於給定關鍵值的元素,這個返回值是乙個pair型別,如果這一對定位器中哪個返回失敗,就會等於end()的值。

(3)erase(iterator)  ,刪除定位器iterator指向的值

erase(first,second),刪除定位器first和second之間的值

erase(key_value),刪除鍵值key_value的值

小結:set中的刪除操作是不進行任何的錯誤檢查的,比如定位器的是否合法等等,所以用的時候自己一定要注意。

(4)find(),返回給定值值得定位器,如果沒找到則返回end()。

(5)insert(key_value);將key_value插入到set中 ,返回值是pair::iterator,bool>,bool標誌著插入是否成功,而iterator代表插入的位置,若key_value已經在set中,則iterator表示的key_value在set中的位置。

inset(first,second);將定位器first到second之間的元素插入到set中,返回值是void.

(6)lower_bound(key_value),返回第乙個大於等於key_value的定位器

upper_bound(key_value),返回最後乙個大於等於key_value的定位器

3.set和multiset、unordered_set的區別

multiset是不去重的,set是去重的;

unordered_set是c++11中引入的新的容器,其內部不再採用紅黑樹實現,而是採用了hash表,加速了檢索速度。

set和map的內部實現是一樣的,unordered_set和unordered_map的內部實現也是一樣的。

STL容器之set用法

目錄 一 set容器概念 二 set構造和基本函式介面 三 統計和查詢 set是一種關聯式容器,底層是通過平衡二叉樹 紅黑樹 實現的,插入 刪除和查詢效率都非常高,所有元素插入容器中,會被預設以公升序的形式進行排序,而且不允許插入已經存在且相同的資料元素。此外還有乙個multiset容器,它的底層實...

STL的set基本用法

set是集合,雖然也存在鍵值和實值,不過兩者根本就是同乙個值,鍵值的設定完全就是為了滿足紅黑樹的底層結構,set操作與map很像不過也有些不同。1 set迭代器與map的不同 1 set使用接引用運算子 取值,而map使用first和second取值。2 set的迭代器都是常量迭代器,不能用來修改所...

STL 中set的用法

set set2 set1 建立set1的副本set2,set2與set1必須有相同的鍵型別和值型別 set set3 b,e 建立set型別的物件set3,儲存迭代器b和e標記的範圍內所有元素的副本。元素的型別必須能轉換為k型別 lower bound 返回指向大於或等於某值的第乙個元素的迭代器 ...