STL系列之六 set與hash set

2021-06-21 22:25:45 字數 2549 閱讀 7018

stl系列之六:set與hash_set

set和hash_set是stl中比較重要的容器,有必要對其進行深入了解。在stl中,set是以紅黑樹(rb-tree)作為底層資料結構的,hash_set是以hash table(雜湊表)作為底層資料結構的。set可以在時間複雜度為o(logn)情況下插入、刪除和查詢資料。hash_set操作的時間複雜度則比較複雜,這取決於雜湊函式和雜湊表的負載情況。下面列出set和hash_set的常用函式:

set和hase_set的更多函式請查閱msdn。

set的使用範例如下(hash_set類似):

// by morewindows(  ) 

#include #include #include using namespace std;

int main()

執行結果如下:

下面試下在set中使用類(結構體也可以類似這樣做)。這個類很簡單,只有乙個成員變數,及設定和獲取這個成員變數的成員函式。

//在set中使用類要過載『<』並實現拷貝建構函式 

// by morewindows( )

#include #include #include using namespace std;

class node

node(const node &na) //拷貝建構函式

int getage()

private:

int m_nage;

}; //不能寫成類的成員函式

inline bool operator < (const node &na, const node &nb)

int main()

編譯,直接報了3個錯誤!!1個在拷貝建構函式,2個在operator<()函式。如下圖所示:

3個錯誤都是一樣的:

error c2662: 「node::getage」: 不能將「this」指標從「const node」轉換為「node &」 轉換丟失限定符

這是怎麼回事呀?分析下,拷貝建構函式與operator<()函式出錯,錯誤都指向了getage()函式,有點古怪,比較下它們與getage()函式,可以發現最大的不同點在於這2個函式都用到了const而getage()函式沒有使用const。難道是這個導致報錯了嗎?先給getage()函式加個const看看,如下:

int getage()  const //增加這個const

returnm_nage;

再編譯,不報錯了。再查下資料,原因如下——因為那2個函式都使用了const修飾的物件,但getage()沒有加上const以保證它不修改物件,編譯器認為這種寫法是不安全的,所以就毫不猶豫報了個錯誤。

這種錯誤如果不親身體會下,到筆試面試時很可能寫了個錯誤程式而自己還處於一無所知中(死在這些小細節上最不值得)。另外,如果使用vc6.0則不會提示詳細的錯誤資訊——「轉換丟失限定符」。

stl還為set提供了一些集合運算的函式,如交集set_intersection()、並集set_union()、差集set_difference()和對稱差集set_symmetric_difference()。這些就不詳細介紹了,有興趣可以自己動手試一試。

下面開始對set和hash_set作個效能測試(win7 +vs2008release下)。

測試**如下:

// by morewindows(  ) 

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

using namespace stdext; //hash_set

// maxn個資料 maxquery次查詢

const int maxn = 10000, maxquery = 5000000;

int a[maxn], query[maxquery];

void printfcontainertelapsetime(char *pszcontainername, char *pszoperator, long lelapsetime)

int main()

在資料容量100萬,查詢次數500萬時,程式執行結果如下:

由於查詢的失敗次數太多,這次將查詢範圍變小使用再測試下:

由於結點過多,80多萬個結點,set的紅黑樹樹高約為19(2^19=524288,2^20=1048576),查詢起來還是比較費時的。hash_set在時間效能上比set要好一些,並且如果查詢成功的機率比較大的話,hash_set會有更好的表現。想知道為什麼hash_set會有優良的效能表現,請看繼集——《stl系列之九 探索hash_set》。

注1.   msdn上講set的erase()是有返回值的,但在vs2008中檢視set的源**,erase()函式的三個過載版本中,有二個返回值都為void即無返回值,另乙個返回size_type。 可以通過檢視msdn上對set的erase()說明。

>>更多交流,請到

chinaunix【c/c++論壇】:

系列printf

maxn函式

0頂一下

0踩一下

STL系列之六 set與hash set

stl系列之六 set與hash set set和hash set是stl中比較重要的容器,有必要對其進行深入了解。在stl中,set是以紅黑樹 rb tree 作為底層資料結構的,hash set是以hash table 雜湊表 作為底層資料結構的。set可以在時間複雜度為o logn 情況下插入...

STL系列之六 set與hash set

stl系列之六 set與hash set set和hash set是stl中比較重要的容器,有必要對其進行深入了解。在stl中,set是以紅黑樹 rb tree 作為底層資料結構的,hash set是以hash table 雜湊表 作為底層資料結構的。set可以在時間複雜度為o logn 情況下插入...

STL系列之六 set與hash set

stl系列之六 set與hash set set和hash set是stl中比較重要的容器,有必要對其進行深入了解。在stl中,set是以紅黑樹 rb tree 作為底層資料結構的,hash set是以hash table 雜湊表 作為底層資料結構的。set可以在時間複雜度為o logn 情況下插入...