//下面介绍一下hashtabl迭代器的主要功能函数operator++ template<class Value, class Key, class HashFen, class ExtractKey, class EqualKey, class Alloc> _hashtable_iterator< Value, Key, HashFen, ExtractKey, EqualKey, Alloc>& _hashtable_iterator< Value, Key, HashFen, ExtractKey, EqualKey, Alloc>::operator++(){ const node* lod=cur;//保存当前节点的指针 cur=cur->next;//如果存在,就返回其下一节点的引用,如果不存在,也就是说该节点位于list的尾端,需要跳向下一个bucket if(!cur){ size_type bucket=ht->bket_num(old->val);//获取当前bucket的位置 while(!cur&&++bucket<buckets.size()) cur=ht->buckets[bucket]; //这里实现的就是bucket的跳跃 } return *this; }
//hashtable部分源代码 template<class Value, //节点的实值类别 class Key, //节点的键值类别 class HashFcn,//hash funtion的函数类别 class ExtractKey,//从节点中取出键值的方法(函数,仿函数) class EqualKey,//判断键值相等与否的方法(函数,仿函数) class Alloc=alloc> class hashtable { public: typedef HashFcn hasher; typedef EqualKey key_equal; typedef size_t size_type; private: hasher hash; key_equal equals; ExtractKey get_key; typedef __hashtable_node<Value> node; vector<node*, Alloc> buckets; // 保存桶的vector size_type num_elements; public: size_type bucket_count() const { return buckets.size(); } }; template<class Value>//节点类 struct __hashtable_node { __hashtable_node *next; Value val; }; //迭代器类 template<class Value, class Key, class HashFen, class ExtractKey, class EqualKey, class Alloc> struct __hashtable_iterator { node *cur; hashtable *ht; };
//hashtable提前准备好28个质数用来设置表格大小(桶的多少),并提供函数查询 static const unsigned long __stl_prime_list[__stl_num_primes] = { 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741, 3221225473ul, 4294967291ul};
hashtable无法处理例如string,float,double这些类型的元素,如果需要处理,则需要自己定义hash funtion
hash_set,hash_map是以hashtable 为底层机制,所以他们的操作行为,只是调用hashtable的操作行为,他们的插入操作调用的是hashtable的insert_unique()
hash_multiset,hash_multimap,同样是以hashtable为底层机制,只不过他们的插入操作采用的是hashtable的insert_equal()
c++11中hash_set/hash_map改名为unordered_map/unordered_set
其底层依旧封装了hashtable,用法与set/map一致