介紹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就可以滿足上述期望。具體操作 上述操作時間複雜度均為常數時間...