/*
*
************************************************************************************
* hash_set雜湊集合容器的基礎說明:
************************************************************************************
*
* hash_set雜湊集合容器:使用hashtable資料結構的具有高效資料檢索的關聯容器
*
* 不提供反向迭代器,只有前向迭代器iterator和const_iterator
* 不允許插入重複的元素索引值
* Hashed Associative Container Simple Associative Container Unique Associative Container
*
* 目前還不是C++的標準容器,只是SGI C++ STL的一個擴充容器
* 使用hash_set必須使用宏語句#include <hash_set>
*
**************************************************************************************
*
* 建立hash_set對象:
* 1.hash_set<int> hs; //索引值比較使用預設的函數對象equal_to<Value>
* 2.hash_set(size_type n); //在質數列表中找出第一個大於等於n的質數作為表長:hash_set<int> hs(100);
* 3.hash_set(size_type n,const hasher& h); //hash函數對象為h
* 4.hash_set(size_type n,const hasher& h,const key_equal& k);//索引值比較函數對象k
* 5.hash_set(const hash_set& h); //用一個hash集合容器拷貝產生另一個hash集合容器:hash_set<int> hs2(hs);
*
**************************************************************************************
*
* 元素的插入
* //typedef pair<const key,T> value_type;
* pair<iterator,bool> insert(const value_type& v);//second:返回true/false插入成功標誌
* void insert(iterator pos,const value_type& v);
*
**************************************************************************************
*
* 元素的刪除
* void erase(iterator pos);
* size_type erase(const key_type& k); //刪除等於索引值k的元素
* void erase(first,last); //刪除[first,last)區間的元素
* void clear();
*
**************************************************************************************
*
* 訪問與搜尋
*
* iterator begin();iterator end(); //不會將元素排序遍曆出來
*
* iterator find(const key_type& k) const; //對於非預設類型如char*,在搜素時應定義相關的函數對象
*
* 其它常用函數
* bool empty() const;
* size_type size() const;
* size_type bucket_count(const key_type& k) const; //獲得hash表的表長
* void swap();
* resize();
* iterator lower_bound();iterator upper_bound();pair<iterator,iterator> equal_range();//上界、下屆、確定區間
*
* 在SGI STL中,提供了以下hash函數:
* struct hash<char*>
* struct hash<const char*>
* struct hash<char>
* struct hash<unsigned char>
* struct hash<signed char>
* struct hash<short>
* struct hash<unsigned short>
* struct hash<int>
* struct hash<unsigned int>
* struct hash<long>
* struct hash<unsigned long>
*
* hash函數決定了如何劃分散列表
*
*
*
********************************************
** cumirror ** tongjinooo@163.com ** **
********************************************
*
*/
#include <hash_set>
#include <iostream>
struct student{
char* name;
int age;
char* city;
char* phone;
};
//自訂資料的比較函數
class stuequal{
public:
bool operator() (const student& a,const student& b){
return strcmp(a.city,b.city)==0; //不允許同名,name為索引值
} //將name換為city測試下
};
//自訂資料的hash函數
//typedef unsigned int size_t;
struct stu_hash{
size_t operator()(const student& stu) const
{
unsigned long res = 0;
char* s=stu.city;
for( ; *s; ++s ){
res=5*res+*s;
}
return size_t(res);
}
};
//針對字串的比較函數對象
class strequal{
public:
bool operator () (const char* a,const char* b)const{
return strcmp(a,b)==0;
}
};
int main(){
using namespace std;
hash_set<const char*,hash<const char*>,strequal> a;
a.insert("tongjin");
a.insert("cumirror");
a.insert("makelaugh");
a.insert("feiguodeyun");
// hash<const char*>預設提供的hash函數對象
hash_set<const char*,hash<const char*>,strequal>::const_iterator b=a.find("tongjin");
cout<<*b<<" is "<<(b!=a.end()?"present":"not present")<<endl;
// 對於自訂類型資料,使用hash相關容器時應構造hash函數對象、比較函數對象
// 注意區別hash函數對象與比較函數對象各自的作用
student s[]={
{"童進",23,"長沙","XXX"},
{"老大",23,"武漢","XXX"},
{"餃子",23,"福州","XXX"},
{"王老虎",23,"地球","XXX"},
{"周潤發",23,"香港","XXX"},
{"周星星",23,"香港","XXX"}, //city重複
{"童進",23,"香港","XXX"} //name重複、city也有重複
};
hash_set<student,stu_hash,stuequal> c;
c.insert(s[0]);
c.insert(s[1]);
c.insert(s[2]);
c.insert(s[3]);
c.insert(s[4]);
c.insert(s[5]);
c.insert(s[6]);
// 注意hash容器並不能實現排序
for(hash_set<student,stu_hash,stuequal>::iterator i=c.begin();i!=c.end();i++){
cout<<i->name<<" "<<i->age<<" "<<i->city<<endl;
}
return 0;
}