C++ STL學習筆記十一 hash_set雜湊集合容器

來源:互聯網
上載者:User

/*
 *
 ************************************************************************************
 *      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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.