STL之hash_set和hash_map


 

一句話hash_set和hash_map:它們皆由Hashtable(Standard C++ Library未公開,只作為底層部件)作為底層容器, 所有的操作也都由Hashtable提供;咋看起來,好似與set和map有很大的關聯,其實不大,只不過hash_set和hash_map有着“set鍵值就是實值,實值就是鍵值,map鍵值就是鍵值,實值就是實值”特征,姑且讓set和map掛掛名:-);

由此,hash_set內部元素也是未經排序的(從Hashtable的實現可知),而hash_map可以經由鍵值索引其對應實值(其重載了“[]”操作符);由Hashtable的底層實現可知:hash_set和hash_map的查找效率和插入操作的平均時間開銷都為O(N/2)。

 

hash_set和hash_map的創建與遍歷

hash_set只需指定鍵值的類型,hash_map需指定鍵值和實值的類型。它們都可以像大多數的容器一樣,通過迭代器,尋訪元素。

......
hash_set<int> ihs; 

ihs.insert(1);
ihs.insert(5);
ihs.insert(6);
ihs.insert(4);
ihs.insert(3);
ihs.insert(3);
ihs.insert(100);

ihs.insert(200);		/*故意的*/

hash_set<int>::iterator beg = ihs.begin(),
	end = ihs.end(),ite;

for(ite = beg; ite != end; ite++)
	cout << *ite << " ";
cout << endl;
......

200 1 3 4 100 5 6

可證見hash_set拒絕插入重復元素(與set性質相同),未排序(違反set性質)。

......
hash_map<int,int> ihm;

ihm.insert(pair<int,int>(1,100));
ihm.insert(pair<int,int>(2,200));
ihm.insert(pair<int,int>(3,300));
ihm.insert(pair<int,int>(4,400));
ihm.insert(pair<int,int>(5,500));

hash_map<int,int>::iterator beg = ihm.begin(),
	end = ihm.end(),ite;

for(ite = beg; ite != end; ite++)
	cout << "<" << ite->first << "," << ite->second << ">" << " ";
cout << endl;

cout << "ihm[1] = " << ihm[1] << endl;		/*可以通過鍵值索引*/
......

<1,100> <2,200> <3,300> <4,400> <5,500>
ihm[1] = 100

hash_set和hash_map的查找

有Hashtable的實現可知,hash_set和hash_map的平均查找效率一樣很高,各自內部有實現find()查找函數,無需使用從頭至尾遍歷的STL <algorithm>find()函數。Standard C++ Library中的實例:http://msdn.microsoft.com/en-US/library/ea54hzhb(v=vs.80).aspx

建議

hash_set和hash_map還實現很多函數,給出參考鏈接:http://msdn.microsoft.com/en-US/library/y49kh4ha(v=vs.80).aspx

外鏈MoreWindows同學的文章:http://blog.csdn.net/morewindows/article/details/7330323,里頭的亮點便是C++里頭語法的細節問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM