STL(七) hashtable(二) 雜湊函式

2021-08-27 18:23:55 字數 2364 閱讀 6673

介紹stl裡hashtable的使用

例子:

#include#includeusing namespace std;

int main()

}

hash table的find函式和count函式:

iterator find(const key_type& key)

return iterator(first, this);

}size_type count(const key_type& key) const

}return result;

}

hash function

定義有數個現成的hash function,全都是仿函式。先前談到hash function是用來計算元素位置的。針對char,int,long這些型別,hash function什麼也沒做,只是返回了原值。但對於字串const char*,就設計了如下轉換函式:

templatestruct hash{};

inline size_t __stl_hash_string(const char* s)

//特化 stl的hash function還是挺簡單的,直接返回值,僅僅處理了型別,返回乙個可mod的值

//stl無法處理上述列出的各型別意外的元素,例如string,double等等,使用者需要自定義自己的hashfunction

_stl_template_null struct hash};//過載了()

_stl_template_null struct hash};

_stl_template_null struct hash};

_stl_template_null struct hash};

_stl_template_null struct hash}

..........

上面**表明,stl無法處理上述所列各項形別以外的元素,例如string,double等等。欲處理這些,使用者必須自定義自己的hash function。

hash_set

雖然stl只規範複雜度和介面,並不規範實現方法,但stl set多以rb-tree為底層機制。sgi則是在stl標誌規格之外又提供了乙個所謂的hash_set,以hashtable為底層機制。由於hash_set所提供的操作介面,hashtable都提供了,所以幾乎所有hash_set的操作行為,都只是轉調了hashtable的操作行為而已。下面是hash_set的**摘錄:

template<

class value,

class hashfunc = hash,

class equalkey = equal_to,

class alloc = alloc>

class hash_set

key_equal key_eq() const

public:

hash_set():rep(100, hasher(), key_equal()){}

explict hash_set(size_type n): rep(n, hasher(), key_equal()){}

hash_set(size_type n, const hasher& hf):rep(n, hf, key_equal()){}

hash_set(size_type n, const hasher& hf, const key_equal& eql):rep(n, hf, eql){}

templatehash_set(inputiterator f, inputiterator l):rep(100, hasher(), key_equal())

templatehash_set(inpuriterator f, inputiterator l, size_type n):rep(n, hasher(),key_equal())

.......//省略成噸的建構函式

public:

size_type size() const

size_type max_size() const

bool empty() const

void swap(hash_set& hs)

friend bool operator== __stl_null_tmpl_args(const hash_set&, const hash_set&);

iterator begin() const

iterator end() const

.....//省略成噸的介面函式

};

總結:

如上便是sgi stl實現hash table以及對接stl標準的**和一些注釋,還是一如既往的樸素而高效。

stl的hashtable底層實現

hashtable在c 的stl裡佔據著比較重要的一席之地。其中的hash set hash map hash multiset hash multimap四個關聯容器都是以hashtable為底層實現方法 技巧 應該說,上述的四個關聯式容器提供的api都是對hashtable原生態api的高層封裝...

STL關聯容器值hashtable

hashtable 雜湊表 是一種資料結構,在元素的插入,刪除,搜尋操作上具有常數平均時間複雜度o 1 雜湊函式 負責將某一元素對映為索引。碰撞 collision 不同的元素被對映到相同的位置。解決碰撞的方法 線性試探法,二次試探法,開鏈等。負載係數 元素個數除以 大小。主集團 平均插入成本的增長...

《STL原始碼剖析》之hashtable

hashtable即雜湊表,也叫雜湊表,它對元素的插入 刪除和訪問操作具有常數時間複雜度的表現,這種表現不依賴於輸入元素的隨機性。假如使用雜湊儲存資料,且該所有的資料是16 bits且不帶正負號,範圍是0 65535,那麼使用乙個array就可以滿足上述期望。具體操作 上述操作時間複雜度均為常數時間...