青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

Hash

我曾在很多C++書籍中看到作者們抱怨標準庫中沒有實現hash_sethase_map,并非常自信地聲稱在下一個標準庫中一定會增加這兩個。我搜索的幫助文檔后,很遺憾地沒有發現相關庫。難道C++的狂熱愛好者把這么重要的庫給忘記了嗎?Boost.Functional/hash庫引進了我的注意,遵循它的指引,我一步一步發發現的散列表的蹤跡。

hash        <boost/functional/hash.hpp>

觀察頭文件的寫法,就知道hashfunctional庫中的一員,更進一步,如果你用過STL中的<functional>,那么多半你也猜到,hash是一個函數。不太完全正確,實事上它是一個函數對象。boost中實現的散列表,使用的散列函數就是它(至于boost中有那些散列函數,以后再列舉)。

如果直接使用hash,先創建一個實例并像函數一樣調用它:

       hash<string> string_hash;

       size_t h = string_hash(“Love”);

它支持的類型有

integers

floats

pointers

strings

擴展類型有

arrays

std::pair

標準容器

定制的類型擴展

如何定制類型

要編寫一個hash可用的類型,兩個必須實現的功能是operator==  hash_value,參考下面的實現:

namespace library {

       struct book {

              int id;

              std::string titile;

       };

       std::size_t hash_value(const book& b) {

              boost::hash<int> hasher;

              return hasher(b.id); // 可以自己寫哈希函數

       }

       bool operator== (const book& a, const book& b) const {

              return a.id == b.id;

       }

}; // namespace library

結合散列值

縱觀上面的hash使用方法,只能對一個參數可hash值。庫也提供了多個參數,示例:

class point {

       int x, y;

public:

       … …

       bool operator==(const point& other) const {      

              return x == other.x && y == other.y;

       }

       friend std::size_t hash_value(const point& p) {

              std::size_t seed = 0;

              boost::hash_combin(seed, p.x);     // combin 的順序不同,得出的結果也不同

              boost::hash_combin(seed, p.y);

              return seed;

};

Unordered      <boost/unordered_set.hpp> ,<boost/unordered_map.hpp>

這個庫實現了無序關聯容器。從某種意義上說,它就是我們需要的散列表。

與有序關聯容器不同的是,它不需要比較,而是需要hash值。我下面列出它的聲明,以求不要理解錯了。

namespace boost {

       template <

              class Key,

              class Hash = boost::hash<Key>,

              class Pred = std::equal_to<Key>,

              class Alloc = std::alloctor<Key> >

       class unordered_set;

}

如果class不是標準庫里的類型,那么hashequal_to的非常關鍵了。

使用

unordered_setunordered_mapsetmap在使用上基本一致。請參考它們的寫法。

更深層次的探索

散列表一個不可避免的問題即是“沖突”,解決沖突的方法有很多,有分離鏈表法、線性探測等。據我所知道,分離鏈表法是在各種庫最常用的方法。unordered的實現用到了桶(bucket),這屬于分離鏈表的變體。每桶對應的是索引,桶里可以有很多元素,它們都是“沖突”的。

線性探測中,一個非常重要的數據就是:裝填因子λ,它是散列表中的元素個數與散列表大小的比值。對于探測散列表,λ≈0.5;對于分離鏈表,λ≈1。在手冊中,unordered中負載因子(load factor)的解釋是“the average number of elements per bucket”,平均每個桶中元素的個數,在數學上,此處的負載因子與前面的裝填因子λ等價。

以下幾個函數用于控制桶的大小

X( size_type n)                                  構造一個新容器,帶有n個桶

X( InputIterator i, InputIterator j, size_type n)            構造有n個的容器,插入區間[i, j)

float load_factor( ) const                            每個桶中的平均數量

float max_load_factor( ) const             當前最大的負載因子

float max_load_factor( float z)             修改最大負載因子,z做為參數

void rehash( size_type n)                     修改桶使至少為n個,且負載因子小于最大負載因子

除了 rehash 以外,其它成員函數如何影響桶的數量并沒有規定,insert 操作僅當插入導致負載因子大于或等于最大負載因子時允許使得迭代器失效。對于多數實現來說,這意味著只有當此事發生時,插入操作才會改變桶的數量。因此,迭代器只會在調用 insert  rehash 時才可能失效,而指向容器中的元素的指針和引用則永不失效。


轉自:http://hi.baidu.com/ani_di/blog/item/41406ce6df3c1f24b83820c1.html

posted on 2010-06-05 17:23 會飛的兔子 閱讀(7901) 評論(0)  編輯 收藏 引用 所屬分類: C++庫,組件
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美国成人直播| 日韩亚洲欧美精品| 国产深夜精品| 夜夜嗨av一区二区三区免费区 | 99re8这里有精品热视频免费| 亚洲欧美日韩在线播放| 欧美日韩成人免费| 亚洲伦理中文字幕| 亚洲级视频在线观看免费1级| 香蕉成人伊视频在线观看| 国产精品视频| 欧美一区二区三区视频| 亚洲在线网站| 国产欧美日韩伦理| 亚洲综合精品| 亚洲男人的天堂在线观看| 国产精品毛片a∨一区二区三区|国| 宅男精品视频| 亚洲午夜在线观看| 国产日本亚洲高清| 久久久久国色av免费观看性色| 欧美一级一区| 激情综合网址| 亚洲福利在线视频| 欧美激情第一页xxx| 国产精品99久久久久久久久| 一区二区三区四区五区精品视频 | 欧美激情精品久久久久久| 亚洲免费电影在线观看| 99视频精品全部免费在线| 国产精品国产三级国产专区53| 亚洲一区精品电影| 欧美在线三级| 亚洲精品一区二区网址| 亚洲色诱最新| 一区二区在线免费观看| 亚洲性线免费观看视频成熟| 欧美精品1区2区| 亚洲欧美日韩一区二区| 欧美一区午夜精品| 最近中文字幕日韩精品| 99这里只有久久精品视频| 久久蜜桃香蕉精品一区二区三区| 亚洲成人影音| 久久超碰97中文字幕| 亚洲午夜激情免费视频| 免费亚洲网站| 久久国产精品久久久久久| 欧美日韩亚洲一区在线观看| 99在线精品视频在线观看| 欧美在线视频观看免费网站| 国产视频一区在线观看| 欧美va亚洲va国产综合| 欧美日韩国产经典色站一区二区三区| 亚洲伊人伊色伊影伊综合网| 久久精品亚洲乱码伦伦中文| 宅男精品导航| 欧美专区亚洲专区| 亚洲无线观看| 久久久久综合一区二区三区| 亚洲性xxxx| 蜜臀av在线播放一区二区三区| 亚洲欧美日韩一区二区| 欧美大片免费观看| 久久久精品国产免费观看同学| 欧美激情偷拍| 免费在线观看一区二区| 国产精品视频自拍| 亚洲人成人77777线观看| 国产在线国偷精品产拍免费yy| 91久久国产自产拍夜夜嗨| 国产亚洲精品自拍| 亚洲私拍自拍| 宅男噜噜噜66一区二区| 欧美成年人视频网站| 久久久一二三| 国产麻豆午夜三级精品| 一本不卡影院| 一本在线高清不卡dvd | 欧美激情一区二区三区在线视频观看| 久久国产手机看片| 国产精品裸体一区二区三区| 亚洲精品中文在线| 亚洲精品色婷婷福利天堂| 久久影音先锋| 欧美韩日一区二区三区| 国产亚洲欧洲997久久综合| 亚洲一二三区在线观看| 亚洲伊人一本大道中文字幕| 欧美日本韩国| 亚洲乱码国产乱码精品精98午夜 | 欧美黑人在线播放| 亚洲成色精品| 欧美91视频| 亚洲福利视频二区| 亚洲美女福利视频网站| 欧美成人午夜激情| 亚洲黄色免费网站| 亚洲每日更新| 国产美女精品| 欧美亚洲免费| 国产精品亚洲а∨天堂免在线| 亚洲伦伦在线| 亚洲性xxxx| 国产精品一区二区久久精品| 亚洲一区二区在线免费观看视频 | 亚洲一区二区欧美| 欧美资源在线观看| 国产一区二区三区在线免费观看| 欧美永久精品| 欧美福利视频网站| 9人人澡人人爽人人精品| 欧美日韩在线亚洲一区蜜芽| 亚洲深夜福利视频| 久久精品国产视频| 玉米视频成人免费看| 欧美成人国产一区二区| 欧美国产综合| 亚洲一区二区三区中文字幕在线 | 免费欧美视频| 9色精品在线| 国产精品入口尤物| 久久久久久久成人| 亚洲人成在线观看| 欧美尤物一区| 亚洲人成在线播放| 国产精品国产成人国产三级| 性欧美video另类hd性玩具| 欧美成va人片在线观看| 亚洲午夜精品久久| 激情综合电影网| 欧美日韩123| 亚洲欧美日韩综合| 91久久精品国产91性色tv| 性xx色xx综合久久久xx| 亚洲国产精品毛片| 国产伦精品免费视频 | 国产中文一区二区| 欧美精品18videos性欧美| 午夜欧美大片免费观看| 亚洲国产精品视频| 欧美一区精品| 亚洲精品在线一区二区| 国产香蕉久久精品综合网| 欧美了一区在线观看| 欧美在线你懂的| 日韩香蕉视频| 欧美在线看片a免费观看| 亚洲黑丝一区二区| 国产欧美韩日| 欧美日韩一区二区在线| 久久视频一区| 性做久久久久久免费观看欧美| 亚洲人成啪啪网站| 欧美高清在线播放| 久久亚洲综合色| 性做久久久久久久久| 在线一区二区三区做爰视频网站| 激情丁香综合| 国产精品三区www17con| 欧美网站在线观看| 欧美日韩高清在线| 牛牛影视久久网| 久久精品亚洲国产奇米99| 亚洲午夜精品| 中文无字幕一区二区三区| 亚洲精品国产拍免费91在线| 欧美77777| 久久爱www久久做| 欧美久久视频| 亚洲性视频h| 久久精品视频免费播放| 亚洲激情图片小说视频| 亚洲永久免费精品| 国产在线拍偷自揄拍精品| 亚洲国产欧美一区二区三区久久| 欧美视频免费看| 亚洲国内在线| 日韩一级视频免费观看在线| 红桃av永久久久| 国产精品影音先锋| 欧美天天在线| 欧美日韩亚洲综合| 欧美成人蜜桃| 欧美极品色图| 欧美国产亚洲视频| 欧美二区在线看| 欧美日韩国产综合视频在线观看| 欧美国产免费| 欧美日韩免费| 国产精品国色综合久久| 国产精品婷婷午夜在线观看| 国产精品美女一区二区| 国产精品日产欧美久久久久| 国产模特精品视频久久久久| 国产亚洲欧美激情| 亚洲黄页视频免费观看| 亚洲伦伦在线| 亚洲一区二区三区色| 久久成人国产|