1. 程式人生 > >STL學習筆記— —無序容器(Unordered Container)

STL學習筆記— —無序容器(Unordered Container)

ring 最大 布局 size fad oca rgs template max

簡單介紹

在頭文件<unordered_set>和<unordered_map> 中定義

namespace std 
{
    template <typename T,
            typename Hash = hash<T>,
            typename EqPred = equal_to<T>,
            typename Allocator = allocator<T> >
        class unordered_set;

    template
<typename T, typename Hash = hash<T>, typename EqPred = equal_to<T>, typename Allocator = allocator<T> > class unordered_multiset; template <typename Key, typename T, typename Hash = hash<T>, typename
EqPred = equal_to<T>, typename Allocator = allocator<pair<const Key, T> > > class unordered_map; template <typename Key, typename T, typename Hash = hash<T>, typename EqPred = equal_to<T>, typename Allocator = allocator<pair<const
Key, T> > > class unordered_multimap; }

unordered_set、unodered_multiset、unordered_map、unodered_multimap都是無序容器,都是以哈希表實現的。

技術分享

技術分享
unordered_set、unodered_multiset結構

技術分享
unordered_map、unodered_multimap結構

Unord和multiUnord操作

構造、復制與析構

Unord c //默認構造函數;創建一個空無序容器

Unord c(bnum) //創建一個空無序容器,內部至少使用了bnum個桶

Unord c(bnum,hf) //創建一個空無序容器,內部至少使用了bnum個桶,hf作為哈希函數

Unord c(bnum,hf,cmp) //創建一個空無序容器,內部至少使用了bnum個桶,hf作為哈希函數,cmp用來識別相等的值

Unord c = c2 //復制構造函數。創建一個新的無序容器作為c2的副本(全部元素都被復制)

Unord c = c2 //復制構造函數;創建一個新的無序容器作為c2的副本(全部元素都被復制)

Unord c(rv) //移動構造函數;使用右值對象rv創建一個新無序容器

Unord c = rv //移動構造函數;使用右值對象rv創建一個新無序容器

Unord c(beg,end) //創建一個無序容器。並使用beg到end範圍內的值進行初始化

Unord c(beg,end,bnum) //創建一個無序容器。並使用beg到end範圍內的值初始化,內部至少使用了bnum個桶

Unord c(beg,end,bnum,hf) //創建一個無序容器。並使用beg到end範圍內的值初始化。內部至少使用了bnum個桶,hf作為哈希函數

Unord c(beg,end,bnum,hf,cmp) //創建一個無序容器,並使用beg到end範圍內的值初始化。內部至少使用了bnum個桶,hf作為哈希函數,cmp用來識別相等的值

Unord c(initlist) //創建一個無序容器,並使用初始化列表進行初始化

Unord c = initlist //創建一個無序容器,並使用初始化列表進行初始化

c.~Unord() //銷毀全部元素並釋放內存

在這裏Unord可能是例如以下的一種:

unordered_set<Elem> //一個無序set,使用默認hash<>,默認比較equal_to<>

unordered_set<Elem,Hash> //一個無序set,使用Hash作為hash函數。默認比較equal_to<>

unordered_set<Elem,Hash,Cmp> //一個無序set,使用Hash作為hash函數,使用Cmp進行比較

unordered_multiset<Elem> //一個無序multiset。使用默認hash<>,默認比較equal_to<>

unordered_multiset<Elem,Hash> //一個無序multiset,使用Hash作為hash函數,默認比較equal_to<>

unordered_multiset<Elem,Hash,Cmp> //一個無序multiset。使用Hash作為hash函數。使用Cmp進行比較

unordered_map<Key,T> //一個無序map,使用默認hash<>。默認比較equal_to<>

unordered_map<Key,T,Hash> //一個無序map,使用Hash作為hash函數,默認比較equal_to<>

unordered_map<Key,T,Hash,Cmp> //一個無序map,使用Hash作為hash函數,使用Cmp進行比較

unordered_multimap<Key,T> //一個無序multimap,使用默認hash<>,默認比較equal_to<>

unordered_multimap<Key,T,Hash> //一個無序multimap,使用Hash作為hash函數。默認比較equal_to<>

unordered_multimap<Key,T,Hash,Cmp> //一個無序multimap,使用Hash作為hash函數,使用Cmp進行比較

布局操作

c.hash_function() //返回哈希函數

c.key_eq() //返回用於比較鍵的相等性的函數

c.bucket_count() //返回眼下桶的個數

c.max_bucket_count() //返回桶的可能的最大數目

c.load_factor() //返回眼下桶內的負載的元素數量

c.max_load_factor() //返回桶可以負載的最大元素數量

c.max_load_factor(val) //設置桶最大負責數量為val

c.rehash(bnum) //又一次生產哈希表,使桶的數目至少為bnum

c.reserve(num) //又一次生產哈希表,以至於有足夠的空間存放num個元素

非變動性操作

c.empty() //推斷容器是否為空,與size()==0同樣。但可能更快

c.size() //返回當前元素數量

c.max_size() //返回可容納的元素最大數量

c1 == c2 //推斷c1與c2是否相等

c1 != c2 //推斷c1與c2是否不相等。等同於!(c1==c2)

特殊查詢操作

c.count(key) //返回鍵值為key的元素個數

c.find(key) //返回第一個鍵值為key的位置,若沒找到返回end()

c.equal_range(key) //返回全部鍵值為key的範圍。如key可以被插入的第一個位置到最後一個位置

賦值

c = c2 //將c2全部元素賦值給c

c = rv //將右值對象rv的全部元素移動賦值給c

c = initlist //使用初始化列表進行賦值

c1.swap(c2) //交換c1和c2的數

swap(c1,c2) //交換c1和c2的數

叠代器相關函數

c.begin() //返回一個前向叠代器,指向第一個元素

c.end() //返回一個前向叠代器,指向最後一個元素

c.cbegin() //返回一個前向常叠代器。指向第一個元素

c.cend() //返回一個前向常叠代器。指向最後一個元素

c.rbegin() //返回一個逆向叠代器,指向逆向叠代的第一個元素

c.rend() //返回一個逆向叠代器。指向逆向叠代的最後一個元素

c.crbegin() //返回一個逆向常叠代器。指向逆向叠代的第一個元素

c.crend() //返回一個逆向常叠代器,指向逆向叠代的最後一個元素

插入和移除元素

c.insert(val) //插入一個val的副本,返回新元素位置(對Unord來說不論成功與否)

c.insert(pos,val) //插入一個val副本,返回新元素位置(pos應該是插入的搜尋起點)

c.insert(beg,end) //將範圍beg到end的全部元素的副本插入到c(無返回值)

c.insert(initlist) //插入初始化列表的全部元素的副本(無返回值)

c.emplace(args...) //插入一個使用args初始化的元素副本,返回新元素位置(對Unord來說不論成功與否)

c.emplace_hint(pos,args...) //插入一個使用args初始化的元素副本,返回新元素位置(pos應該是插入的搜尋起點)

c.erase(val) //移除全部與val值相等的元素。並返移除的元素個數

c.erase(pos) //移除叠代器位置的元素,並返回下個元素的位置

c.erase(beg,end) //移除beg到end範圍內的全部元素,並返回下個元素的位置

c.clear() //移除所以元素,清空容器

bucket接口

c.bucket_count() //返回眼下桶的個數

c.bucket(val) //返回值val會被查詢到的桶的索引

c.bucket_size(buckidx) //返回buckidx桶內的元素個數

c.begin(buckidx) //返回buckidx桶內指向第一個元素的前向叠代器

c.end(buckidx) //返回buckidx桶內指向第一個元素的前向叠代器

c.cbegin(buckidx) //返回buckidx桶內指向第一個元素的前向常叠代器

c.cend(buckidx) //返回buckidx桶內指向第一個元素的前向常叠代器

把unordered_map當作關聯數組使用

c[key] //返回一個指向鍵值為key的元素的引用。假設不存在就插入這個元素

c.at(key) //返回一個指向鍵值為key的元素的引用

STL學習筆記— —無序容器(Unordered Container)