1. 程式人生 > >Hashmap 原始碼與原理

Hashmap 原始碼與原理

本文參考了三篇博文:

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");  
}