一 hash_set的定义:
(1)hash_set以hashtable为底层机制,所以几乎所有的hash_set操作行为都是调用hashtable的操作行为而已。
(2)hash_set与set区别:
1.hash_set以hashtable为底层机制,而set以RB-tree为底层机制。
2.由于1,所以set有元素自动排序功能,而hash_set没有。
3.set在logN的下完成查找、插入和删除操作;hash_set可在常数时间复杂度下完成查找、插入和删除,但取决于哈希表的负载情况。
4.hash_set的使用方式与set是完全相同的。
(3)<hash_set>中hash_set的定义:
template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
class hash_set
{
private:
typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
_EqualKey, _Alloc> _Ht;//这里提取键值的方法identity已经提供,所以声明hash_set对象时不需再提供。_Alloc也是已经提供的。
_Ht _M_ht;//底层机制以hashtable完成
}
二 hash_set的使用
1.在gcc环境下使用hash_set需包含<ext/hash_set>,并using namespace __gnu_ccc。
2.具体操作,见实现文件<ext/hash_set>。
2.使用举例:
#include<iostream>
#include<ext/hash_set>//MinGW使用hash_set需包含这个头文件。
using namespace std;
using namespace __gnu_cxx;
int main()
{
hash_set<int,hash<int>,equal_to<int> >ht;//set具有默认构造函数。
cout<<ht.bucket_count()<<endl;//输出193,因为缺省使用大小为100的vector,而接近于100的内置的质数为193.
}
三 hash_multiset:允许键值重复。