Hashmap 原始碼與原理
阿新 • • 發佈:2019-01-08
本文參考了三篇博文:
1、https://blog.csdn.net/u010335911/article/details/26297859
2、https://blog.csdn.net/srzhz/article/details/7881946/
3、https://blog.csdn.net/ddkxddkx/article/details/6555754
下面給出原始碼,其他內容參考上述博文吧
hashmap 原始碼
#include <stdlib.h> #include <string> #include <iostream> #include<hash_map> using namespace std; struct string_less : public binary_function<const string, const string, bool> //定義虛擬函式,以使用hashmap函式 { public: result_type operator()(const first_argument_type& _Left, const second_argument_type& _Right) const { return(_Left.compare(_Right) < 0 ? true : false); } }; int main() { hash_map<string, int , hash_compare<string, string_less> > zhao; hash_map<string, int, hash_compare<string, string_less>>::iterator zhi; hash_map<string, int, hash_compare<string, string_less>>::iterator qiang; hash_map<string, int, hash_compare<string, string_less>>::iterator miss; hash_map<string, int, hash_compare<string, string_less>>::iterator you; //執行監視zhao為{ size=9 } zhao["a"] = 1;//鍵a對應值1 zhao["b"] = 2; zhao["c"] = 3; zhao["d"] = 4; zhao["e"] = 5; zhao["f"] = 6; zhao["g"] = 7; zhao["h"] = 8; zhao["i"] = 9; zhi=zhao.begin(); //監視顯示zhi為("a",1) cout<<zhi->first<<" "<< zhi->second<<endl; //輸出為:a 1 即first代表鍵 second代表值 qiang = zhi; //可以直接賦值鍵值對哦 cout << (++zhi)->first<<" "; cout<< (zhi)->second<<endl; //輸出f 6。即雜湊桶內下一組鍵值.分開輸入是因為cout輸出流問題 while (qiang != zhao.end()) //遍歷該雜湊桶,可以看到字母的順序afgbcdehi 即是一定順序存放的,不要想當然以為按照字母順序 { cout << qiang->first << "\t" << qiang->second << endl; qiang++; } qiang = zhao.end(); //監視內容: <讀取字串的字元時出錯。>, -842150451)end應該是最後一個鍵值對後的空間,將其- -就應該是最後一個鍵值對 cout<<zhao.at("d")<<endl; //輸出4 此函式用於找到鍵對應的值 cout<<zhao.cbegin()->first<<endl; //輸出a,此函式用於返回hash_map第一個元素的迭代器 cout << (--zhao.cend())->first <<endl; //輸出i。返回一個常量迭代器,此迭代器用於發現hash_map中最後一個元素後的位置。cend與end的區別在於end返回一個迭代器,而cend是一個常量迭代器 。 cout << zhao.crbegin()->first << endl; //輸出i。返回一個常量迭代器,此迭代器用於發現反向hash_map中的首個元素。 cout << (--zhao.crend())->first << endl; //輸出a。返回一個常量迭代器,此迭代器用於發現反向hash_map中最後一個元素後的位置。 記得- -哦。 //zhao.clear(); //親測可用,清除整個hash。 cout<<zhao.count("a")<<endl; //此處輸出1 返回 1,若 hash_map 包含排序關鍵字引數匹配鍵的元素;返回0,若 hash_map 不包含具有匹配鍵的元素。 cout<<zhao.emplace("j", 10).first->first<<endl; //插入一個元素,通過遍歷親測發現若已經存在該鍵則無操作,若不存在則進行插入。 cout<<zhao.emplace_hint(zhao.begin(), "k", 11)->first<<endl; //輸出K 。 插入構造一個元素到 hash_map,附帶位置提示.完全不知道第一個變數是幹什麼的,通過遍歷發現並不是插入到該位置,但是返回值可以直接定位到該鍵 cout << zhao.empty()<<endl; //輸出0 . 若為空則輸出1,非空則輸出0. cout<< zhao.equal_range("h").first->first<<endl; //輸出h hash_map中鍵比指定鍵大或相等的第一個元素。 cout << zhao.equal_range("h").second->first << endl; //輸出i hash_map中鍵比指定鍵大的第一個元素,使用j VS崩潰了。 zhao.erase("k"); //刪除掉該鍵,若不存在則無法刪除 cout<<zhao.find("a")->second<<endl; //輸出1 顯而易見。找到該鍵 zhao.insert(++zhao.begin(),--zhao.end()); //這個insert,將一個或一個範圍的元素插入hash_map。 我嘗試了好多好多引數,終於大概理解了,就是把另一個的一段hash插入到這邊來。或者這樣zhao.insert(zhi,qiang); //zhao.key_comp(); 先不做介紹了,上面那個insert就研究了二十分鐘多才懂 同理 zhao.lower_bound()也先放下 upper_bound()也放下 cout << zhao.size()<< endl; //10輸出元素個數 zhao.swap(zhao); //交換兩個物件元素的hashmap,或者swap(zhao,zhao);由於我只定義了一個物件..親多定義一個就可以了。 system("pause"); }